繁体   English   中英

在C ++中使用模板化类的嵌套类作为模板模板参数

[英]Use nested class of templated class as template template parameter in C++

在C ++中,我想在模板化的类中使用嵌套类作为模板模板参数。 对于非嵌套类,模式为:

template<class T>
class A {
public:
    T a;
    // ...
};

template<class T, template<class ST> class S>
class B {
public:
    S<T> b;
    // ...
};

B<int, A> b;

现在我想向A添加一个嵌套类,并使用这个嵌套类作为B类的模板模板参数S ,如下所示:

template<class T>
class A {
public:
    class AA {
    public:
        T aa;
        // ...
    };
    // ...
};

template<class T, template<class ST> class S>
class B {
public:
    S<T> b;
    // ...
};

B<int, A> b1;          // ok
B<int, A::AA> b2;      // error
B<int, A<int>::AA> b3; // error

我理解b2b3的声明是错误的,因为A::AA是不完整的, A<int>::AA不是模板。

我希望能够声明类似于b2东西。 这个想法是AB都应该使用相同的T类。

我希望能够声明一些类似于A的类,并使用单独命名的子类。 我可以想到的另一个用途是A多个子类,可以用作B模板模板参数。

我看到的一个解决方法是避免在A的子类上使用单个名称,使用b1声明(使用A作为B模板模板参数S )并相应地更改B的实现(即使用S::AA<T>而不是S<T> ):

template<class T, template<class ST> class S>
class B {
public:
    S::AA<T> b;
    // ...
};

B<int, A> b;

我看到的另一种解决方法是将B类的模板模板参数减少为一个简单的模板参数,并通过其他方式确保相同的T

还有其他可能吗? 如果有,怎么样?

编辑 :在templateB添加了遗忘的class ,并将模板模板参数名称更改为ST

这对我有用:

template<class T>
class A {
public:
    class AA {
    public:
        T aa;
        // ...
    };
    // ...
};

template<class T, template<class ST> class S >
class B {
public:
    S<T> b;
    // ...
};

template<class T> using NestedAA = typename A<T>::AA;

int main()
{
  B<int, NestedAA> b; // ok

  return 0;
}

如果由于任何原因您受限于C ++ 03,则无法使用类型别名。 然后,您可以使用以下NestedAA定义替换“using”语句:

template<class T>
class NestedAA : public A<T>::AA
{
};

假设您希望嵌套的情况起作用,并且由于AA本身不是模板,您可以删除B的第二个参数的模板,如下所示:

template<class T>
class A {
public:
    class AA {
    public:
        T aa;
        // ...
    };
    // ...
};

template<class T, class S>
class B {
public:
    S b;
    // ...
};

//B<int, A> b1;          // error
B<int, A<int>::AA> b2;      // ok

PS你原来的B声明需要一个额外的'class'来编译g ++ 5.4

template<class T, template<class T> class S>

您可以创建模板别名:

template <typename T>
using innerAA = typename A<T>::AA;

然后

B<int, innerAA> b42;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM