测试lambda是否是无状态的? [英] Test if a lambda is stateless?
本文介绍了测试lambda是否是无状态的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如果lambda是无状态的,如果它捕获任何东西,我该如何测试?
我的猜测是使用重载解析与函数指针重载,还是模板特化?
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 template specialization?
int a;
auto l1 = [a](){ return 1; };
auto l2 = [](){ return 2; };
// test l1 and l2, get a bool for statelessness.
推荐答案
根据标准,捕获任何变量,然后可以隐式转换为函数指针。
As per the Standard, if a lambda doesn't capture any variable, then it is implicitly convertible to function pointer.
基于这一点,我想出了 is_stateless< $ c>元函数,它告诉您lambda是否是无状态的
Based on that, I came up with is_stateless<>
meta-function which tells you whether a lambda is stateless or not.
#include <type_traits>
template <typename T, typename U>
struct helper : helper<T, decltype(&U::operator())>
{};
template <typename T, typename C, typename R, typename... A>
struct helper<T, R(C::*)(A...) const>
{
static const bool value = std::is_convertible<T, R(*)(A...)>::value;
};
template<typename T>
struct is_stateless
{
static const bool value = helper<T,T>::value;
};
这里是测试代码:
int main()
{
int a;
auto l1 = [a](){ return 1; };
auto l2 = [](){ return 2; };
auto l3 = [&a](){ return 2; };
std::cout<<std::boolalpha<<is_stateless<decltype(l1)>::value<< "\n";
std::cout<<std::boolalpha<<is_stateless<decltype(l2)>::value<< "\n";
std::cout<<std::boolalpha<<is_stateless<decltype(l3)>::value<< "\n";
}
输出:
false
true
false
在线演示。
这篇关于测试lambda是否是无状态的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文