मैं एक टेम्पलेट फ़ंक्शन में अन्य लैम्ब्डा से खाली (कैप्चरलेस) लैम्ब्डा की पहचान करने का तरीका खोज रहा हूं। मैं वर्तमान में C ++ 17 का उपयोग कर रहा हूं, लेकिन मैं C ++ 20 उत्तरों के लिए भी उत्सुक हूं।
मेरा कोड इस तरह दिखता है:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
क्या यह सी ++ मानक (17 या 20) की गारंटी देता है कि एक कैप्चरलेस लैम्ब्डा, जो एक फ़ंक्शन पॉइंटर के लिए परिवर्तनीय है, क्या std::is_empty
उपज को भी सच कर देगा?
इस कोड को एक उदाहरण के रूप में लें:
auto a = []{}; // captureless
auto b = [c = 'z']{}; // has captures
static_assert(sizeof(a) == sizeof(b)); // Both are the same size
static_assert(!std::is_empty_v<decltype(b)>); // It has a `c` member
static_assert(std::is_empty_v<decltype(a)>); // Passes. It is guaranteed?
+lambda
) में रूपांतरण अच्छी तरह से बनता है या नहीं।