如何不使用auto声明std::mem_fn类型变量用于后续赋值?
不用auto声明std::mem_fn变量的两种方法
你尝试直接指定std::mem_fn的模板参数是行不通的,因为std::mem_fn是一个函数模板,它接受成员指针作为参数后返回的是一个未指定具体名称的函数对象类型,没法直接通过std::mem_fn<...>的形式来声明变量。下面是两种可行的替代方案:
方案一:使用std::function包装
根据成员函数的签名,我们可以用std::function来匹配std::mem_fn生成对象的调用签名。对于void Class::display()这个成员函数,调用时需要传入一个Class的实例(引用或指针均可),对应的std::function类型可以是std::function<void(Class&)>或者std::function<void(Class*)>:
#include <iostream> #include <functional> class Class { public: void display() { std::cout << "display" << std::endl; } }; int main() { // 用引用传递实例的版本 std::function<void(Class&)> m = std::mem_fn(&Class::display); Class instance; m(instance); // 或者用指针传递实例的版本 std::function<void(Class*)> m2 = std::mem_fn(&Class::display); m2(&instance); }
方案二:使用decltype推导类型
利用decltype可以获取std::mem_fn(&Class::display)表达式的返回类型,直接用这个类型来声明变量:
#include <iostream> #include <functional> class Class { public: void display() { std::cout << "display" << std::endl; } }; int main() { // 直接用decltype声明变量 decltype(std::mem_fn(&Class::display)) m = std::mem_fn(&Class::display); Class instance; m(instance); // 或者先定义类型别名,再声明变量(更清晰) using MemFnType = decltype(std::mem_fn(&Class::display)); MemFnType m2 = std::mem_fn(&Class::display); m2(instance); }
为什么你的尝试失败?
std::mem_fn的模板参数不是用来指定返回值和类的,它的模板参数是成员指针的类型,通常编译器会自动推导这个参数,不需要手动指定。你写的std::mem_fn<void(), Class>或std::mem_fn<void, Class>不符合它的模板参数规则,所以无法通过编译。
内容的提问来源于stack exchange,提问作者Thomas W.
相关产品推荐
相关产品推荐

