提问者:小点点

如何替换模板模板参数专门化中的using模式


我有一段代码,它是做模板专门化的常用模式。为了移除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不会编译。我需要一个机制来检索一个仍然“打开”的类型。

谢谢!


共1个答案

匿名用户

您可能是指processor1不是类型

template<>
struct FindDefaultProcessor<DataType1>
{
    template <typename U>
    using type = Processor1<U>;
};

并且需要额外的关键字template:

template<class TResult,
         template<class> class TProcessor = FindDefaultProcessor<TResult>::template type>
                                                                           ^^^^^^^^

演示