我有类似以下内容:
template <typename T>
class A {
public:
typedef T Type;
};
template <typename...> class B;
template <typename TFirst, typename... TRest>
class B<TFirst, TRest...> : public B<TRest...> {
public:
typedef typename TFirst::Type Type;
TFirst a;
virtual void func(TFirst a, Type t) = 0;
};
template <>
class B<> {};
struct X {};
struct Y {};
class ASub1 : public A<X> {};
class ASub2 : public A<Y> {};
class BSub : public B<ASub1, ASub2> {
public:
// Implement all pure virtual methods
// void func(ASub1 a1, Type t) override {}
// void func(ASub2 a2, Type t) override {}
};
现在我有两个问题:
BSub
中实现所有纯虚方法?我以某种方式需要访问所有ASubX
的模板参数(类型)。 a
来访问所有成员ASubX
?我的意思是如果get<ASub1>(b_sub)
是b_sub
的实例,则类似于BSub
。 我希望使用C++ 14解决方案。
最佳答案
对于(1),您可以编写
class BSub : public B<ASub1, ASub2> {
public:
void func (ASub1, typename ASub1::Type) override {}
void func (ASub2, typename ASub2::Type) override {}
};
或者,记住
ASub1::Type
是X
而ASub2::Type
是Y
,class BSub : public B<ASub1, ASub2> {
public:
void func (ASub1, X) override {}
void func (ASub2, Y) override {}
};
对于W.F.建议的(2),您可以使用
b_sub.B<ASub1, ASub2>::a
访问
ASub1
组件,并b_sub.B<ASub2>::a
访问
ASub2
一个。以下是完整的工作(简化)示例
#include <iostream>
#include <type_traits>
template <typename T>
struct A
{ using Type = T; };
template <typename...>
struct B;
template <typename TFirst, typename ... TRest>
struct B<TFirst, TRest...> : public B<TRest...>
{
using Type = typename TFirst::Type;
TFirst a;
virtual void func (TFirst a, Type t) = 0;
};
template <>
struct B<> {};
struct X {};
struct Y {};
struct ASub1 : public A<X> {};
struct ASub2 : public A<Y> {};
struct BSub : public B<ASub1, ASub2>
{
void func (ASub1, X) override { std::cout << 1 << std::endl; }
void func (ASub2, Y) override { std::cout << 2 << std::endl; }
};
int main()
{
BSub bs;
bs.func(ASub1{}, X{});
bs.func(ASub2{}, Y{});
using T1 = decltype(bs.B<ASub1, ASub2>::a);
using T2 = decltype(bs.B<ASub2>::a);
static_assert(std::is_same<T1, ASub1>{}, "!");
static_assert(std::is_same<T2, ASub2>{}, "!");
}
关于c++ - 通过类型获取具有递归继承的可变参数模板的阴影成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47455154/