是否可以使typedef仅对子类可见?

时间:2013-05-16 21:25:56

标签: c++ templates

假设:

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 的孩子?

4 个答案:

答案 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<...>>
{
};