enable_if コンパイル条件によるオーバーロード

Concept-controlled polymorphism
というテクニックらしいです


boost::enable_if

namespace shand {

// enable_if
template <bool, class Type = void>
struct enable_if_c {
    typedef Type type;
};

template <class Type>
struct enable_if_c<false, Type> {};

template <class Cond, class Type = void> 
struct enable_if : public enable_if_c<Cond::value, Type> {};


// disable_if
template <bool, class Type = void>
struct disable_if_c {
    typedef Type type;
};

template <class Type>
struct disable_if_c<true, Type> {};

template <class Cond, class Type = void> 
struct disable_if : public disable_if_c<Cond::value, Type> {};

} // namespace shand
#include <iostream>
#include <shand/type_traits.hpp>
#include <shand/enable_if.hpp>

using namespace std;
using namespace shand;

template <class Type>
void disp(Type value, typename enable_if<is_integral<Type> >::type* = 0)
{
    cout << "整数 : " << value << endl;
}

template <class Type>
void disp(Type value, typename disable_if<is_integral<Type> >::type* = 0)
{
    cout << "整数じゃない : " << value << endl;
}

int main()
{
    disp(314);  // 整数 : 314
    disp(3.14); // 整数じゃない : 3.14
    return 0;
}

ライブラリまとめ