模板类需要模板参数吗?

时间:2014-04-21 12:46:43

标签: 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();
}

1 个答案:

答案 0 :(得分: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>(); }
};