测试lambda是否是无状态的? [英] Test if a lambda is stateless?

查看:327
本文介绍了测试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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆