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

Rob*_*bin 5 c++ templates inner-classes template-templates

在 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;
Run Code Online (Sandbox Code Playgroud)

现在,我想一个嵌套类添加A和使用嵌套类为模板,模板参数S类的B,就像这样:

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
Run Code Online (Sandbox Code Playgroud)

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

我希望能够声明类似于b2. 这个想法是A并且B应该都使用相同的类T

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

一个解决方法我看到的是从的子类中使用个人的名字不要A,使用b1声明(使用A作为模板的模板参数SB),改变实施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;
Run Code Online (Sandbox Code Playgroud)

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

还有其他可能吗?如果是,如何?

编辑:添加遗忘classtemplateforB并将模板模板参数名称更改为ST.

Mat*_*cci 5

这对我有用:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

template<class T>
class NestedAA : public A<T>::AA
{
};
Run Code Online (Sandbox Code Playgroud)


Jar*_*d42 1

您可以创建模板别名:

template <typename T>
using innerAA = typename A<T>::AA;
Run Code Online (Sandbox Code Playgroud)

进而

B<int, innerAA> b42;
Run Code Online (Sandbox Code Playgroud)

演示