如何使用SFINAE与nullary成员函数?

时间:2016-12-11 21:44:55

标签: c++ sfinae

我有一个包含布尔模板参数can_fly的类模板void fly();。根据该值,我想启用带有签名#include <type_traits> template<bool can_fly> class Bird { public: template<typename void_t = typename std::enable_if<can_fly>::type> void_t fly() { /* ... */ } }; int main() { Bird<true> flyingBird; flyingBird.fly(); Bird<false> flightlessBird; return 0; } 的成员函数。

这是我的代码:

main

此代码在Visual Studio 2015中编译得很好,但是GCC抱怨说&#34; 没有名为&#39; type&#39;在&#39; struct std :: enable_if&#39; &#34;在::type的第三行。

我认为false案例中没有<svg>这一事实是SFINAE的全部观点。有人可以向我解释我做错了什么以及正确的做法是什么?

1 个答案:

答案 0 :(得分:1)

作为mentioned in this answer

  

enable_if有效,因为替换模板参数会导致错误,因此从重载决策集中删除了替换,并且编译器只考虑其他可行的重载。

在您的情况下,没有替换因为can_fly在实例化时已知。您可以创建虚拟默认bool模板参数,以使SFINAE正常工作:

template<bool can_fly>
class Bird {
public:
    template<bool X = can_fly, typename = typename std::enable_if<X>::type>
    void fly() { /* ... */ }
};

wandbox example