reference_wrapper引用原语

时间:2014-03-07 16:57:15

标签: c++ c++11 function-pointers functor reference-wrapper

我的印象是我可以使用reference_wrapper生成一个函数,它将返回传递给reference_wrapper ctor的对象。但这不起作用。我做错了吗?如果是这样,有更好的方法来实现这一目标吗?我可以写一个lambda,看起来我不应该这样做。

#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 );
}

5 个答案:

答案 0 :(得分:2)

成员变量存在类似的功能。也许你对此感到困惑。

struct foo { int bar; };

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

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';

答案 1 :(得分:1)

std::reference_wrapper不会生成仿函数。如果原始类型为Callable,则它只是一个仿函数 - std::reference_wrapper::operator()仅在存储引用属于可调用类型时才可用。

目前尚不清楚为什么你需要这个仿函数,但如果是这样的话,那么lambda可能是最简单的解决方案。

答案 2 :(得分:0)

reference_wrapper仅在其引用的对象可调用时才可调用。它的operator()只调用引用的可调用对象。如果引用的对象不可调用,则operator()不存在。从这个意义上说,它的行为就像一个“真正的”参考。

refWrap()等同于thirteen(),因此形成不良。

答案 3 :(得分:0)

std::reference_wrapper::operator()只有在包装可调用对象时才参与重载解析。 int不是一个,所以你要求的东西不起作用。

你可以这样做:

int thirteen = 13;
auto refWrap = bind( [&thirteen] { return thirteen; } );
funPtrPrinter( refWrap );

现在你有一个可调用的bind表达式,可以在funPtrPrinter()中调用。

如果我是你,我会跳过中间人并传入一个lambda。

int thirteen = 13;
funPtrPrinter( [&thirteen] { return thirteen; } );

答案 4 :(得分:0)

所以有一种方法可以使用std::integral_constant完成此任务:

const int thirteen = 13;
auto refWrap = bind( &std::integral_constant< int, thirteen >::operator int, std::integral_constant< int, thirteen >() );

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

const int thirteen = 13;
auto refWrap = [=](){ return thirteen; };