2010-08-10 157 views
2

我有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作爲它們的模板參數嗎?

回答

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> 

,它應該工作的罰款。

0

它可以完成,但我不喜歡這個解決方案。

的問題是,假設我定義:

template <class Arg, class Policy> class Polymorph; 

這是您的MyClassA類型的推廣,但其行爲可以通過使用策略來改變(在編譯時)(認爲Allocator標準集裝箱例如)。

然後,我只是不能使用你的界面,因爲我的課有兩個參數,而你的規範只與一個工作的...

因此,我更喜歡第一種方法,即使有點冗長。爲了從二者受益,你有2個解決方案(包括涉及鴨打字):

  • 你只是使用使用轉發第二種方法第一種方法,然後第二類中定義的第一類(已完成)第一個論點。這樣,模板類別與您的要求不符的人們仍然可以從您的工作中受益。
  • 由用戶自己決定爲其類提供duck-typing,以便從多個參數類創建一個參數類。繼承和模板不能很好地混合,因此這可能會導致問題,我會贊成先前的想法(把庫作家的負擔)。

這改變與C++ 0X的出現:後溶液變爲template'd的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方式,即使它更詳細。