【问题标题】:Enable method based on boolean template parameter启用基于布尔模板参数的方法
【发布时间】:2015-05-14 03:02:43
【问题描述】:

我想实现一个基于布尔模板参数的私有函数。类似的东西:

#include <iostream>

using namespace std;

template <bool is_enabled = true>
class Aggregator {
public:
    void fun(int a) {
        funInternal(a);
    }

private:
    void funInternal(int a, typename std::enable_if<is_enabled>::type* = 0) {
        std::cout << "Feature is enabled!" << std::endl;
    }

    void funInternal(int a, typename std::enable_if<!is_enabled>::type* = 0) {
        std::cout << "Feature is disabled!" << std::endl;
    }
};

int main()
{
   Aggregator<true> a1;
   Aggregator<false> a2;

   a1.fun(5);
   a2.fun(5);

   return 0;
}

但上面的程序无法编译:错误:在 'struct std::enable_if' void funInternal(int a, typename std::enable_if::type* = 0) 中没有名为 'type' 的类型。

是否可以通过 enable_if 实现所需的行为?

【问题讨论】:

  • 不说为什么,我可以说这可能是您可以对代码进行的最小更改:coliru.stacked-crooked.com/a/480dd15245cdbb6f
  • 啊,所以诀窍是从类模板参数创建一个方法参数?
  • 我认为它的工作原理与此相同:youtube.com/watch?v=dTeKf5Oek2c&t=2244
  • @chris 如果我没记错的话,在 OP 中,重载是基于 value (即非类型模板参数),而该视频正在重载不同种类。不管这个细节如何,你认为它应该仍然有效吗?
  • @JamesAdkison,有点不同,但该值成为std::enable_if 的第一个参数。应用相同的逻辑,用户可以调用a1.fun&lt;false&gt;(5),事情会发生变化,就像std::enable_if 的正常使用一样。

标签: c++ templates enable-if


【解决方案1】:

以下是对cmets中@chris提供的解决方案(http://coliru.stacked-crooked.com/a/480dd15245cdbb6f)的改编,貌似可以满足你的需求。

#include <iostream>

template<bool is_enabled = true>
class Aggregator
{
public:
    void fun(int a)
    {
        funInternal(a);
    }

private:
    template<bool enabled = is_enabled>
    void funInternal(typename std::enable_if<enabled, int>::type a)
    {
        std::cout << "Feature is enabled!" << std::endl;
    }

    template<bool enabled = is_enabled>
    void funInternal(typename std::enable_if<!enabled, int>::type a)
    {
        std::cout << "Feature is disabled!" << std::endl;
    }
};

int main()
{
    Aggregator<true> a1;
    Aggregator<false> a2;

    a1.fun(5);
    a2.fun(5);

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2014-03-26
    • 2017-12-13
    相关资源
    最近更新 更多