【问题标题】:c++ template member function specialization based on parameter valuec++基于参数值的模板成员函数特化
【发布时间】:2014-09-16 06:38:19
【问题描述】:

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

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

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);

   }
};

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

更新(重写示例):

我检查了旧代码,但我的示例不正确,没有用于推断类型的基类。我已将水果更改为 int 和 float 以便更好地理解。

【问题讨论】:

  • 您可以根据参数值推断模板,但只能在编译时进行。也许您可以在您的要求中添加更多细节。
  • 为什么不只是有一个 GetFruit 函数,它返回一个 FruitBase 指针,并根据简单的 ifswitch 声明?不要让事情过于复杂。
  • 我现在的情况就是这样,但是需要手动投。
  • 如果FruitBase 包含在子类中被覆盖的正确虚拟成员函数,为什么需要强制转换?似乎我们有一个the XY problem 的案例,您告诉我们您需要帮助解决的解决方案,但您并没有真正告诉我们您要解决什么问题。您的问题可能还有其他解决方案。
  • GetSignal 是什么?

标签: c++ templates type-deduction


【解决方案1】:

以下内容可能会有所帮助:

// 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多