我使用定义的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
? auto
是否应该被正确推断?
[Works for me](http://coliru.stacked-crooked.com/a/b83c21fddc4e15cb)。你的'clang'版本是什么,具体的错误信息是什么? – Rakete1111
@ Rakete1111'候选模板被忽略:被'enable_if''禁用 Apple LLVM版本8.1.0(铛-802.0.42) – subzero
你为什么要检查它是否可以用'T&'*或*'T &&'调用?你用'T&'来调用它,只需检查一下。 – Barry