无法使SFINAE工作
Cannot get SFINAE to work
这是我第一次尝试SFINAE:
#include <type_traits>
#include <iostream>
struct C1 {
using T = int;
};
struct C2 {
using T = void;
};
// For classes that declare T = int
template <class C>
void f(C &c,
std::enable_if<!std::is_same<typename C::T, void>::value, int>::type = 0) {
std::cout << "With T" << std::endl;
}
// For classes that declare T = void
template <class C>
void f(C &c,
std::enable_if<std::is_same<typename C::T, void>::value, int>::type = 0) {
std::cout << "Without T" << std::endl;
}
int main() {
C1 c1;
f(c1); // With T
C2 c2;
f(c2); // Without T
return 0;
}
编译器(gcc 4.8.2)抱怨:
‘std::enable_if<!(std::is_same<typename C::T, void>::value), int>::type’ is not a type
我做错了什么?
您需要几个typename
才能工作:
// For classes that declare T = int
template <class C>
void f(C &c,
typename std::enable_if<!std::is_same<typename C::T, void>::value, int>::type = 0) {
std::cout << "With T" << std::endl;
}
// For classes that declare T = void
template <class C>
void f(C &c,
typename std::enable_if<std::is_same<typename C::T, void>::value, int>::type = 0) {
std::cout << "Without T" << std::endl;
}
或者,如果您的编译器支持C++14,您可以使用std::enable_if_t
:
// For classes that declare T = int
template <class C>
void f(C &c,
std::enable_if_t<!std::is_same<typename C::T, void>::value, int> = 0) {
std::cout << "With T" << std::endl;
}
// For classes that declare T = void
template <class C>
void f(C &c,
std::enable_if_t<std::is_same<typename C::T, void>::value, int> = 0) {
std::cout << "Without T" << std::endl;
}
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- SFINAE:它如何与派生类一起工作?
- 为什么这个 SFINAE 没有按预期工作?
- Sfinae如何工作
- 如何将模板参数从类型更改为非类型使 SFINAE 工作
- 为什么SFINAE(enable_if)从类定义内部工作而不是从外部工作
- 构造函数上的SFINAE在VC2017中工作,但在clang / gcc中不起作用
- 为什么Sfinae在此示例中无法正常工作
- 变量args SFINAE默认构造函数在clang中工作,但在Visual Studio 2015中失败
- 这个 SFINAE C++语法是如何工作的
- SFINAE 不在 llvm/clang 上工作
- 无法使SFINAE工作
- 无法让SFINAE在功能检测器中工作
- SFINAE不像预期的那样工作
- 不可能启用/禁用带有sfinae的typedef.工作区
- SFINAE在返回类型中工作,但不作为模板参数
- 如何使用椭圆的SFINAE工作
- 为什么SFINAE导致编译器错误,它应该工作
- SFINAE 在以下功能has_member无法正常工作