मैं 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
एस सही ढंग से नहीं लेना चाहिए?
[मेरे लिए काम करता है] (http://coliru.stacked-crooked.com/a/b83c21fddc4e15cb)। आपका 'क्लैंग' संस्करण क्या है और विशिष्ट त्रुटि संदेश क्या है? – Rakete1111
@ Rakete1111 'उम्मीदवार टेम्पलेट पर ध्यान नहीं दिया: द्वारा 'enable_if'' अक्षम एप्पल LLVM संस्करण 8.1.0 (बजना-802.0.42) – subzero
तुम क्यों की जाँच कर रहे हैं अगर यह' टी एंड '* या *' टी के साथ प्रतिदेय है && '? आप इसे 'टी एंड' के साथ बुला रहे हैं, बस इसे जांचें। – Barry