基于布尔模板参数启用方法

moo*_*moo 7 c++ templates enable-if

我想基于布尔模板参数实现一个私有函数.像这样的东西:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*son 10

以下是@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;
}
Run Code Online (Sandbox Code Playgroud)