我试图实现一个“模板模板模板” - 模板类满足我的需求(我是使用模板元编程相当新的)。不幸的是,我发现以下主题已经太晚了: 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