我有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作爲它們的模板參數嗎?
我有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作爲它們的模板參數嗎?
是的,可以通過使用「模板模板參數」來完成。
申報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>
,它應該工作的罰款。
它可以完成,但我不喜歡這個解決方案。
的問題是,假設我定義:
template <class Arg, class Policy> class Polymorph;
這是您的MyClassA
類型的推廣,但其行爲可以通過使用策略來改變(在編譯時)(認爲Allocator
標準集裝箱例如)。
然後,我只是不能使用你的界面,因爲我的課有兩個參數,而你的規範只與一個工作的...
因此,我更喜歡第一種方法,即使有點冗長。爲了從二者受益,你有2個解決方案(包括涉及鴨打字):
這改變與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方式,即使它更詳細。