抱歉,我不知道如何找到这个问题的好标题,随时编辑.
我有一系列具有相同角色的类,这意味着它们都实现了相同的接口(方法集).考虑它们都从相同的抽象类继承(即使在最小的例子中不是这种情况;它不是这个问题的重点).这些类都是模板化的.
我想定义一个类抽空模板参数,说T和U,和以前的一个类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)
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)