我的印象是我可以使用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 );
}
答案 0 :(得分:2)
成员变量存在类似的功能。也许你对此感到困惑。
struct foo { int bar; };
如果您有一个包含公共成员变量的类,则可以使用std::mem_fn
和std::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; };