模板类需要模板参数吗?

She*_*ohn 2 c++ templates

抱歉,我不知道如何找到这个问题的好标题,随时编辑.

我有一系列具有相同角色的类,这意味着它们都实现了相同的接口(方法集).考虑它们都从相同的抽象类继承(即使在最小的例子中不是这种情况;它不是这个问题的重点).这些类都是模板化的.

我想定义一个类抽空模板参数,说TU,和以前的一个类A 无模板参数.在内部,这个新类将使用A<T>A<U>.这可能吗?欢迎使用C++ 11答案,如有必要,可随意添加标签.

失败的例子在这里:

#include <iostream>

// ------------------------------------------------------------------------

struct eng_tag {};
struct fr_tag {};
struct sp_tag {};

// First implementation of the "talk interface"
template <class T = eng_tag> struct A
{
    void talk() { std::cout<<"Hello\n"; }
};
template <> struct A<fr_tag>
{
    void talk() { std::cout<<"Salut\n"; }
};
template <> struct A<sp_tag>
{
    void talk() { std::cout<<"Ola\n"; }
};

// Second implementations
template <class T = eng_tag> struct B
{
    void talk() { std::cout<<"Bye\n"; }
};
template <> struct B<fr_tag>
{
    void talk() { std::cout<<"A bientot\n"; }
};
template <> struct B<sp_tag>
{
    void talk() { std::cout<<"Adios\n"; }
};

// etc...

// ------------------------------------------------------------------------

template <class T, class U, class I = A>
struct Wrapper
{
    I<T> one() { return I<T>(); }
    I<U> two() { return I<U>(); }
};

// ------------------------------------------------------------------------

int main()
{
    Wrapper<fr_tag,sp_tag,B> w;
        w.one().talk();
        w.two().talk();
}
Run Code Online (Sandbox Code Playgroud)

jro*_*rok 5

A是模板,而不是类型.所以你需要的是模板模板参数([1],[2]):

template <class T, class U, template<typename> class I = A>
//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^ template template parameter
struct B
{
    I<T> one() { return I<T>(); }
    I<U> two() { return I<U>(); }
};
Run Code Online (Sandbox Code Playgroud)