Tôi đang sử dụng cấu trúc is_callable
quy định như sauKiểm tra nếu một chức năng là 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;
};
Tôi đang sử dụng này để thử nghiệm một lambda tuyên bố như sau:
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++;
});
Tại sao điều này không biên soạn trên enable_if
trên AppleClang? Không nên auto
s được suy luận chính xác?
[Làm việc cho tôi] (http://coliru.stacked-crooked.com/a/b83c21fddc4e15cb). Phiên bản 'clang' của bạn là gì và thông báo lỗi cụ thể là gì? – Rakete1111
@ Rakete1111 'mẫu ứng cử viên bị bỏ qua: bị vô hiệu hóa bởi 'enable_if'' Apple LLVM phiên bản 8.1.0 (clang-802.0.42) – subzero
Tại sao bạn kiểm tra xem nó có thể gọi với' T & '* hoặc *' T &&'? Bạn đang gọi nó bằng 'T &', chỉ cần kiểm tra điều đó. – Barry