【发布时间】:2017-12-20 17:47:14
【问题描述】:
我使用的is_callable结构定义如下
template <typename F, typename... Args>
struct is_callable {
template <typename U>
static auto test(U* p) -> decltype((*p)(std::declval<Args>()...), void(), std::true_type());
template <typename U>
static auto test(...) -> decltype(std::false_type());
static constexpr bool value = decltype(test<F>(nullptr))::value;
};
我正在使用它来测试声明为:
template <typename T>
struct runner {
T t;
template <typename F, typename = typename std::enable_if<is_callable<F, T&>::value || is_callable<F, T&&>::value>::type>
void run(F&& f) {
return f(t);
}
};
runner<int> a{0};
a.run([&] (auto& x) {
x++;
});
为什么在 AppleClang 上的 enable_if 上编译失败? autos 不应该被正确推断吗?
【问题讨论】:
-
Works for me。你的
clang版本是什么,具体的错误信息是什么? -
@Rakete1111
candidate template ignored: disabled by 'enable_if'Apple LLVM 版本 8.1.0 (clang-802.0.42) -
你为什么要检查它是否可以用
T&或T&&调用?你用T&调用它,检查一下。 -
为什么要在 false_type() 周围加上 decltype?您的函数只能返回 false_type。另外,为什么其他测试中的 void() ?您可能需要 F* 类型的 nullptr。最后,您的 enable_if 用户是错误的。由于泛型 lambda 需要 C++14,不妨使用更简单的 enable_if_t。
标签: c++ lambda c++14 metaprogramming enable-if