最近写代码的时候,总能在不少STL的函数声明里看见可爱的std::enable_if,虽然自己偶尔用过,不过也只是直接用STL库里的std::is_arithmetic之类。
于是就去Google了std::enable_if,然后参考了如下几篇post,写了一个较为通用的Module Check。
- Introduction to Type Traits in the C++ standard library
- SFINAE and enable_if
- Tips and tricks » EnableIf<C++11>
- C++技巧: SFINAE
- C++ metafunction to determine whether a type is callable
所以还是先从一个小的问题开始讲起吧~
假设我们做了一个中间类作为接口,这个中间类有一个模版构造函数,它接受一个类实例和一个double类型的参数,并且总是调用一个固定的实例方法。
class Intermediate { public: template <typename T> Intermediate(const T& object, double value) { object.method(value); } };
现在我们有如下的类,
class A { public: void method(double d) const { std::cout<<d<<'\n'; } }; class B { public: void method(int i) const { std::cout<<i<<'\n'; } };
虽然如下代码可以编译运行,但是假如我们希望只有类A被这样调用才有效呢?
Intermediate inter_a_1(a, 2.33); // print 2.33 Intermediate inter_b_1(b, 2.33); // print 2