Std:Enable_if可以有条件地编译成员函数我试着用一个简单的例子来理解如何使用std::enable_if..在我读完之后这个答案我认为想出一个简单的例子应该不难。我想用std::enable_if在两个成员函数之间进行选择,并且只允许其中一个被使用。不幸的是,下面的代码没有用GCC 4.7编译,经过几个小时的尝试,我问你们我的错误是什么。#include <utility>#include <iostream>template< class T >class Y {
public:
template < typename = typename std::enable_if< true >::type >
T foo() {
return 10;
}
template < typename = typename std::enable_if< false >::type >
T foo() {
return 10;
}};int main() {
Y< double > y;
std::cout << y.foo() << std::endl;}GCC报告了以下问题:% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x enable_if.cpp -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'为什么g+不删除第二个成员函数的错误实例化?根据标准,std::enable_if< bool, T = void >::type只有当布尔模板参数为真时才存在。但是为什么g+不认为这是SFINAE呢?我认为重载错误消息来自g+不删除第二个成员函数的问题,并认为这应该是过载
3 回答
哔哔one
TA贡献1854条经验 获得超8个赞
我也是这么想的,我试着用 std::is_same< T, int >::value
和 ! std::is_same< T, int >::value
结果是一样的。
Y<int>
T
!std::is_same< T, int >::value
Y<int>
class Y<int> { public: /* instantiated from template < typename = typename std::enable_if< std::is_same< T, int >::value >::type > T foo() { return 10; } */ template < typename = typename std::enable_if< true >::type > int foo(); /* instantiated from template < typename = typename std::enable_if< ! std::is_same< T, int >::value >::type > T foo() { return 10; } */ template < typename = typename std::enable_if< false >::type > int foo();};
std::enable_if<false>::type
enable_if
DIEA
TA贡献1820条经验 获得超2个赞
#include <iostream>#include <type_traits>class foo;class bar;template<class T>struct is_bar{ template<class Q = T> typename std::enable_if<std::is_same<Q, bar>::value, bool>::type check() { return true; } template<class Q = T> typename std::enable_if<!std::is_same<Q, bar>::value, bool>::type check() { return false; }};int main(){ is_bar<foo> foo_is_bar; is_bar<bar> bar_is_bar; if (!foo_is_bar.check() && bar_is_bar.check()) std::cout << "It works!" << std::endl; return 0;}
慕仙森
TA贡献1827条经验 获得超7个赞
#include <utility>#include <iostream>template< typename T >class Y { template< bool cond, typename U > using resolvedType = typename std::enable_if< cond, U >::type; public: template< typename U = T > resolvedType< true, U > foo() { return 11; } template< typename U = T > resolvedType< false, U > foo() { return 12; }};int main() { Y< double > y; std::cout << y.foo() << std::endl;}
g++ -std=gnu++14 test.cpp
./a.out 11
- 3 回答
- 0 关注
- 1844 浏览
添加回答
举报
0/150
提交
取消