Concept-controlled polymorphism
というテクニックらしいです
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; }