加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C lambda捕获约束

发布时间:2020-12-16 05:48:11 所属栏目:百科 来源:网络整理
导读:是否可以约束作为参数给出的lambda的捕获类型? 例如,是否可以仅采用不通过引用捕获任何内容的lambda? template typename Fvoid f(const F lambda) // F must be a lambda that do not capture by ref{ :::} 解决方法 MSalters指出“非捕获lambda可以转换为
是否可以约束作为参数给出的lambda的捕获类型?
例如,是否可以仅采用不通过引用捕获任何内容的lambda?
template <typename F>
void f(const F& lambda) // F must be a lambda that do not capture by ref
{
  :::
}

解决方法

MSalters指出“非捕获lambda可以转换为指向函数的指针”.这是什么意思? lambda对象将匹配指向函数参数类型的指针.

将lambda类型转换为指向函数的指针是很棘手的.以下是我对合规实施的尝试.这有点hackish.

#include <type_traits>

template< typename fn >
struct ptmf_to_pf;

template< typename r,typename c,typename ... a >
struct ptmf_to_pf< r (c::*) ( a ... ) const >
    { typedef r (* type)( a ... ); };

// Use SFINAE to hide function if lambda is not convertible to function ptr.
// Only check that the conversion is legal,it never actually occurs.

template< typename lambda >
typename std::enable_if< std::is_constructible<
         typename ptmf_to_pf< decltype( &lambda::operator() ) >::type,lambda >::value >::type
f( lambda arg ) {
    arg( "hello " );
    arg( "worldn" );
}

#include <iostream>

int main() {
int x = 3;
    f( []( char const *s ){ std::cout << s; } ); // OK
    f( [=]( char const *s ){ std::cout << s; } ); // OK
    f( [=]( char const *s ){ std::cout << s << x; } ); // error
}

这不会接受函数指针作为直接参数,因为模板参数需要解析为仿函数.您可以通过为ptmf_to_pf提供接受指向函数类型的指针的专门化来实现.

此外,正如演示所示,它不会接受通过值以及引用捕获任何内容的lambda.在C中没有办法使限制如此具体.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读