我有ClassA<ARG_TYPE>
和ClassB<ARG_TYPE>
。现在我想要使用ClassC
,它有共同的ARG_TYPE
和提到的类作为模板参数。
ClassC<ARG_TYPE, ClassA<ARG_TYPE>, ClassB<ARG_TYPE>>
很简单。
但是可以声明ClassC<ARG_TYPE, ClassA, ClassB>
以便A和B类都知道使用ARG_TYPE作为模板参数吗?
答案 0 :(得分:5)
是的,可以通过使用“模板模板参数”来完成。
按如下方式声明ClassC:
template<typename Arg,
template<typename T_Arg> class T_ClassA,
template<typename T_Arg> class T_ClassB>
class ClassC
{
typedef T_ClassA<Arg> MyClassA;
typedef T_ClassB<Arg> MyClassB;
// Use MyClassA and MyClassB
};
使用
ClassC<Arg, ClassA, ClassB>
它应该可以正常工作。
答案 1 :(得分:0)
可以做到,但我不太喜欢这个解决方案。
问题是假设我定义:
template <class Arg, class Policy> class Polymorph;
这是MyClassA
类型的一般化,但可以通过使用策略更改(在编译时)其行为(例如,对于标准容器,请考虑Allocator
。)
然后我就不能使用你的界面了,因为我的类只有两个参数,而你的规范只适用于一个......
因此,我更喜欢第一种方法,即使有点冗长。为了从两者中受益,你有2个解决方案(都涉及鸭子打字):
随着C ++ 0x的出现,这种情况发生了变化:后来的解决方案变成了模板化的typedef,效果更好:)
这是C ++ 0x中的一个例子:
template <class Arg, template <class> class ClassA>
struct MyTemplate
{
typedef ClassA<Arg> classA_type;
};
template <class Arg, class Policy> class Polymorph;
// C++0x required for following declaration
template <class Arg>
typedef Polymorph<Arg, ConservativePolicy> ConservativePolymorph;
typedef MyTemplate<int, ConservativePolymorph> MyTemplateC;
如果您没有可用的C ++ 0x,请回避这一点并重新使用STL方式,即使它更详细。