【发布时间】:2017-10-26 13:16:58
【问题描述】:
要判断某个函数是否存在函数,可以使用如下:
template <typename...Ts>
using void_t = void;
void fn(int);
struct X {};
template <typename T, typename = void_t<decltype(fn(std::declval<T>()))>>
void fn2(T) { }
void test() {
fn2(int(1)); // works
//fn2(X()); // doesn't work
}
现在,有没有一种方法可以检测 fn(T) 类型是否不存在 T?
例子:
void test2() {
//fn2(int(1)); // doesn't work
fn2(X()); // works
}
这样做的原因是定义一个排除操作,以便我可以为两者定义fn2(),以避免产生歧义错误。
【问题讨论】:
-
我建议将检查包装在类型特征中。然后否定与任何其他特征相同。
-
@Quentin,已修复
-
Aaaaand Clang bug :|没有
void_t<>也能正常工作。 -
@Quentin,是的 耸耸肩。我目前并不担心 Clang 的错误。 ;)
-
@kabanus,已编辑答案以回答您的问题。
标签: c++ c++11 templates sfinae typetraits