我有一段代码,它是做模板专门化的常用模式。为了移除main函数第一行中为Processor1指定DataType1的要求,我想改为接收一个template模板参数。看起来using指令不支持分配“open”模板参数,而且我在web中找不到任何这样的示例(可能我没有使用适当的关键字进行搜索...)
#include <iostream>
struct DataType1 {};
struct DataType2 {};
template<class TDataType>
struct BaseMessage{ using DataType = TDataType; };
template<class TDataType>
struct ChildMessage : public BaseMessage<TDataType> {};
template<class TDataType>
struct Processor1 {
static void func() { std::cout << "Processor1" << std::endl; }
};
template<class TDataType>
struct Processor2 {
static void func() { std::cout << "Processor2" << std::endl; }
};
template<class TResult>
struct FindDefaultProcessor;
template<>
struct FindDefaultProcessor<DataType1>
{
using type = Processor1;
};
template<class TResult, template<class> class TProcessor = FindDefaultProcessor<TResult>::type>
void func()
{
TProcessor<typename TResult::DataType>::func();
}
int main()
{
func<ChildMessage<DataType2>, Processor1>();
return 0;
}
所以问题很“简单”,我如何让这段代码编译呢?在FindDefaultProcessor中,使用type=Processor1不会编译。我需要一个机制来检索一个仍然“打开”的类型。
谢谢!
您可能是指processor1
不是类型
template<>
struct FindDefaultProcessor<DataType1>
{
template <typename U>
using type = Processor1<U>;
};
并且需要额外的关键字template
:
template<class TResult,
template<class> class TProcessor = FindDefaultProcessor<TResult>::template type>
^^^^^^^^
演示