Search code examples
c++templatesenable-if

Enable method based on boolean template parameter


I want to implement a private function based on a boolean template parameter. Something like that:

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

But the program above does not compile: error: no type named 'type' in 'struct std::enable_if' void funInternal(int a, typename std::enable_if::type* = 0).

Is it possible to realize the desired behavior with enable_if?


Solution

  • The following is an adaptation of the solution (http://coliru.stacked-crooked.com/a/480dd15245cdbb6f) provided by @chris in the comments, which seems to meet your needs.

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