以下代码works ,但我不明白为什么会这样。
#include <functional>
#include <iostream>
#include <memory>
struct foo
{
int get_val() const
{
return 42;
}
};
int main()
{
foo obj;
std::shared_ptr<foo> ptr = std::make_shared<foo>();
const auto getter = std::mem_fn( &foo::get_val );
std::cout << getter( obj ) << std::endl;
std::cout << getter( ptr ) << std::endl;
}
为什么getter
可以用在obj
和ptr
上?我希望它只适用于 obj
。
最佳答案
来自std::mem_fn
cppreference page :
Function template
std::mem_fn
generates wrapper objects for pointers to members, which can store, copy, and invoke a pointer to member. Both references and pointers (including smart pointers) to an object can be used when invoking astd::mem_fn
.
简短的回答:因为标准是这么说的。
我猜它只是一个更方便和通用的接口(interface),例如,您可以编写一个调用 std::mem_fn
的模板函数,它将使用引用和指针:
const auto getter = std::mem_fn( &foo::get_val );
template <typename T>
void call_getter(T&& x)
{
// do something
getter(x);
// do something
}
int main()
{
foo obj;
std::shared_ptr<foo> ptr = std::make_shared<foo>();
call_getter( obj );
call_getter( ptr );
}
在上面的例子中你只需要一个call_getter
的重载。
关于c++ - 为什么从 std::mem_fn 返回的可调用对象可以用于对象和 shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41569844/