假设:
template <...>
class InheritedByManyClasses
{
public:
typedef InheritedByManyClasses<...> ParentClass;
};
如果我生一个孩子的也是更多班级的家长,那么有什么方法可以将这个想法联系起来吗?
template<...>
class ChildInheritedByMany : InheritedByManyClasses<...>
{
public:
typedef ... ParentClass; // oops! now this class can't benefit from parent typedef
};
我是否可以通过某种方式在孩子身上制作typedef
的孩子?
答案 0 :(得分:5)
using
template<typename T>
struct A {
protected:
using V = std::vector<T>;
};
template<typename T>
struct B : A<T> {
protected:
typename A<T>::V i;
public:
using A<T>::V; // If you want to make it public now
};
int main() {
// A<int>::V i; // Not visible
B<int>::V i; // visible
}
答案 1 :(得分:2)
将其设为protected
并按顺序将typedef
放入子项中:
struct A
{
};
struct B : public A
{
protected:
typedef A Parent;
};
struct C : public B
{
protected:
typedef B Parent;
};
答案 2 :(得分:1)
您可以将typedef
改为子类:
template<...>
class ChildInheritedByMany : InheritedByManyClasses<...>
{
public:
typedef InheritedByManyClasses<...> ParentClass;
};
此外,根据您的使用情况,std::is_base_of
可能派上用场。
答案 3 :(得分:1)
不,没有。所有成员始终对当前班级可见。但是,有一个简单的解决方法:
template<typename T>
struct base_typedef_shim : T
{
typedef T ParentClass;
// the usual C++11 perfect constructor forwarding stuffs
};
template <...>
class InheritedByManyClasses
{
};
template<...>
class ChildInheritedByMany : public base_typedef_shim<InheritedByManyClasses<...>>
{
};
template<...>
class GrandChild : public base_typedef_shim<ChildInheritedByMany<...>>
{
};