模板参数

时间:2010-08-10 09:59:35

标签: c++ visual-studio-2008 templates visual-c++

我有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作为模板参数吗?

2 个答案:

答案 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个解决方案(都涉及鸭子打字):

  • 您只需使用第一种方法定义第一个类,然后使用第二种方法定义第二个类,该方法将(现在完整的)参数转发给第一个。这样,具有与您的要求不符的模板类的人仍然可以从您的工作中受益。
  • 由用户为其类提供duck-typing,以便从多个参数类创建一个参数类。继承和模板虽然不能很好地混合,但这可能会导致问题,我赞成以前的想法(把负担放在图书馆作家身上)。

随着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方式,即使它更详细。