我試圖實現一個「模板模板模板」 - 模板類滿足我的需求(我是使用模板元編程相當新的)。不幸的是,我發現以下主題已經太晚了: Template Template Parameters如何避免在c + +中的「模板模板模板」模板
不過,我需要實現類似下面列出的內容。
根據編譯器,最後一個typedef不起作用。我不確定,但我認爲這是由於3倍模板限制的限制。在這個簡單的例子中是否有可能繞過3xtemplate定義?
template < typename TValueType >
class ITTranslator
{
public:
ITTranslator() = 0;
virtual ~ITTranslator() = 0;
virtual void doSomething() = 0;
}
template < typename TValueType >
class TConcreteTranslator1 : public ITTranslator<TValueType>
{
public:
TConcreteTranslator1(){}
~TConcreteTranslator1(){}
void doSomething() {}
}
template < typename TValueType >
class TConcreteTranslator2 : public ITTranslator<TValueType>
{
public:
TConcreteTranslator2(){}
~TConcreteTranslator2(){}
void doSomething() {}
}
template <
typename TValueType,
template < typename TValueType > class TTranslatorValueType
>
class ITClassifier
{
public:
ITClassifier() = 0;
virtual ~ITClassifier() = 0;
}
template <
typename TValueType,
template < typename TValueType > class TTranslatorValueType
>
class TConcreteClassifier1 : public ITClassifier<TValueType,TTranslatorValueType >
{
public:
TConcreteClassifier1() {}
~TConcreteClassifier1() {}
void dodo(){}
}
template <
typename TValueType,
template <typename TValueType> class TTranslatorValueType,
template <template<typename TValueType> class TTranslatorValueType> class TClassifierValueType
>
class ITAlgorithm
{
public:
ITAlgorithm()=0;
virtual ~TAlgorithm()=0;
virtual run() = 0;
}
template <
typename TValueType,
template <typename TValueType> class TTranslatorValueType,
template <template<typename TValueType> class TTranslatorValueType> class TClassifierValueType
>
class TConcreteAlgorithm1 : public ITAlgorithm<TValueType,TTranslatorValueType,TTranslatorValueType>
{
public:
TConcreteAlgorithm1(){}
~TConcreteAlgorithm1(){}
run()
{
TClassifierValueType< TTranslatorValueType>* l_classifier_pt = new TClassifierValueType< TTranslatorValueType>();
// add this object to a internal list...
}
}
int main()
{
typedef TConcreteTranslator1<cvbase::uint32_t> translator_t;
typedef TConcreteClassifier1< cvbase::uint32_t, TConcreteTranslator1> classifier_t;
typedef TConcreteAlgorithm1 < cvbase::uint32_t, TConcreteTranslator1, TConcreteClassifier1> algorithm_t; // not possible
return 0;
}
非常感謝,我非常感謝任何幫助!
編輯: 我已經延長我的清單(我敢肯定它不會編譯:))顯示的動機,爲什麼我用我的奇怪概念:)
'模板模板'參數幾乎從來沒有解決任何問題。這個陳述並不像我們使用可變參數模板和可變模板模板參數之前所使用的那樣不正確,但它們仍然很不可用。 – pmr
什麼是「模板模板類」?你的意思是一個「模板模板參數」? –
就我所見,模板^ 3參數僅用於限制可接受類型的範圍。你仍然使用'TClassifier'實例化'TAlgorithm',而不是'TClassifier'(其中btw有2個templ參數),並且在n> 1時沒有使用模板^ n參數名稱。 –
dyp