c ++模板成员函数基于参数值的特化

时间:2014-09-16 06:38:20

标签: c++ templates type-deduction

我尝试在相当大的旧c ++项目中简化c ++代码解决以下简单示例将帮助我将模式应用于我使用的代码。代码非常大我把它简化为核心问题。

我想编写c ++模板代码,它可以根据参数(例如enum)在编译时推断出模板类型。在我目前的代码中,我必须手工编写模板类型

GetSignal<int*>(Signals::Clear) 

可能容易出错。我想实现SomeMagicNeedToBeHere以引起预期的行为。

enum Signals{ Clear, Filtered};


template <class DATA> class ContainerClass 
    : public SomeMagicNeedToBeHere<int*,Signals::Clear>,
      public SomeMagicNeedToBeHere<float*,Signals::Filtered>
{
   void DoSomething()
   {
        //auto == int*
        auto clear = GetSignal(Signals::Clear);

        //auto == float*
        auto filtered = GetSignal(Signals::Filtered);

   }
};

可以根据参数值以及如何推断出类型?

UPDATE(重写示例):

我检查了旧代码并且我的示例不正确,没有基类用于输入的类型。我已将水果改为int并浮动以便更好地理解。

1 个答案:

答案 0 :(得分:2)

以下内容可能有所帮助:

// helper to get some type depending of signal
template <Signals sig> struct helper;

// specialization for each Signal to get type
template <>
struct helper<Clear>
{
    using type = int*;
};

template <>
struct helper<Filtered>
{
    using type = float*;
};

// And you may do similar stuff with function (and be generic if the type helper is enough)
template <Signals sig>
typename helper<sig>::type GetSignal()
{
    return nullptr;
}