How would I go about testing if a lambda is stateless, that is, if it captures anything or not? My guess would be using overload resolution with a function pointer overload, or
#include // std::true_type, std::false_type
#include // std::declval
template
auto is_captureless_lambda_tester(int)
-> decltype( +std::declval(), void(), std::true_type {} );
template
auto is_captureless_lambda_tester(long)
-> std::false_type;
template
using is_captureless_lambda = decltype( is_captureless_lambda_tester(0) );
Does not work for polymorphic lambdas, require as a precondition that the argument be a closure type. (E.g. is_captureless_lambda
is std::true_type
.)