首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reference_wrapper引用原语

reference_wrapper引用原语
EN

Stack Overflow用户
提问于 2014-03-07 16:57:15
回答 5查看 189关注 0票数 0

我的印象是,我可以使用reference_wrapper生成一个函子,该函子将返回传递给reference_wrapper ctor的对象。但这不管用。我做错了吗?如果是这样的话,是否有更好的方法来实现这一点?我可以写个朗姆达,好像我不应该写。

代码语言:javascript
复制
#include <iostream>
#include <functional>
using namespace std;

void funPtrPrinter( function< int( void ) > output )
{
    cout << output() << endl;
}

int main( void )
{
    int thirteen = 13;
    auto refWrap = ref( thirteen );
    funPtrPrinter( refWrap );
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-04-02 12:32:37

因此,有一种方法可以使用std::integral_constant来实现这一点

代码语言:javascript
复制
const int thirteen = 13;
auto refWrap = bind( &std::integral_constant< int, thirteen >::operator int, std::integral_constant< int, thirteen >() );

这确实解决了这个问题,但就所有意图和目的而言,它都不如lambda:

代码语言:javascript
复制
const int thirteen = 13;
auto refWrap = [=](){ return thirteen; };
票数 0
EN

Stack Overflow用户

发布于 2014-03-07 17:51:14

成员变量也有类似的特性。也许你把它和那个搞混了。

代码语言:javascript
复制
struct foo { int bar; };

如果有一个具有公共成员变量的类,则可以使用std::mem_fnstd::bind创建返回变量值的函子。

代码语言:javascript
复制
auto f = std::mem_fn(&foo::bar);
std::cout << f(foo{42}) << '\n';

auto g = std::bind(&foo::bar, foo{42});
std::cout << g() << '\n';
票数 2
EN

Stack Overflow用户

发布于 2014-03-07 17:26:32

std::reference_wrapper不生成函子。它只是一个函子,如果原始类型是Callable - std::reference_wrapper::operator()是可用的,只有当存储的引用是可调用的类型。

还不清楚为什么需要函子,但如果是这种情况,lambda可能是最简单的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22256071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档