Sto cercando un modo per identificare lambda vuote (senza capotasto) da altre lambda in una funzione modello. Attualmente sto usando C ++ 17 ma sono curioso anche per le risposte C ++ 20.
Il mio codice è simile al seguente:
template<typename T>
auto func(T lambda) {
// The aguments of the lambdas are unknown
if constexpr (/* is captureless */) {
// do stuff
}
}
È garantito dallo standard C ++ (17 o 20) che anche un lambda senza cattura, che è convertibile in un puntatore a funzione, renderà std::is_empty
vero il rendimento?
Prendi questo codice come esempio:
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?
+
sembra funzionare qui .
+lambda
) è ben formata.