C ++部分模板专业化 - 设计简化

时间:2015-04-24 09:15:11

标签: c++ templates c++11 pipeline partial-specialization

我正在研究管道/数据流设计模式。我有一个类'算法数据输出'("Uncaught TypeError: Cannot set property 'textContent' of null"... ),它充当两个连接的网段之间的接口。特别是,它提供了方法模板AlgorithmOutput,用于从“数据发送器”类型的对象输出数据。

当前设计基于用户派生自类getOutput<size_t N>并提供方法模板AlgorithmOutput的有限数量的实现的想法。我还需要能够允许用户从方法getOutput<size_t N>提供自己的自定义返回类型(即返回类型不能是多态的)。此外,有必要使getOutput的所有实现都能够访问定义为方法所属类的成员的相同数据集。

当前解决方案在用户派生的类中使用部分显式特化来定义方法getOutput的不同实现。我想简化解决方案,并希望在不失去当前设计功能的情况下,如何做到这一点。

编辑:我只关心从用户的角度来实现方法getOutput的简易性。我并不担心基类的实现有多复杂。

派生类的实现示例:

getOutput

1 个答案:

答案 0 :(得分:3)

您可以使用标记调度来避免需要部分特化。简化版本:

//we'll use this to overload functions based on a size_t template param
template <size_t N>
struct Size2Type{};

class PipeOutputClass
{
public:
    template <size_t N>
    auto getOutput(size_t c_Idx) const
    {
        //use Size2Type to tag dispatch
        return getOutputImpl(Size2Type<N>{}, c_Idx);
    }

    //default version for when we don't explicitly provide an overload
    template <size_t N>
    auto getOutputImpl(Size2Type<N>, size_t c_Idx) const
    {
         throw std::runtime_error("Wrong template argument.");
    }

    //overload for when N = 0
    std::unique_ptr<double> getOutputImpl (Size2Type<0>, size_t c_Idx) const
    {
        std::unique_ptr<double> mydouble(new double(10));
        return mydouble;
    }

    //overload for when N = 1
    std::unique_ptr<int> getOutputImpl (Size2Type<1>, size_t c_Idx) const
    {
        std::unique_ptr<int> myint(new int(3));
        return myint;
    }
};