C++20中如何获取成员函数指针的返回类型?
在C++20中获取成员函数指针的返回类型
有两种简洁且符合C++20标准的方法可以提取成员函数指针的返回类型:
方法一:模板特化提取
通过定义通用模板特化,直接解析成员函数指针的类型结构,提取返回类型:
#include <iostream> class Test { public: Test(int value) : m_value{value} {} int getValue() {return m_value;} int m_value; }; // 模板特化解析成员函数指针 template<typename MemFn> struct member_function_traits; // 针对非const成员函数指针的特化 template<typename Class, typename Ret, typename... Args> struct member_function_traits<Ret(Class::*)(Args...)> { using return_type = Ret; }; // 针对const成员函数指针的特化(按需添加) template<typename Class, typename Ret, typename... Args> struct member_function_traits<Ret(Class::*)(Args...) const> { using return_type = Ret; }; // 别名模板简化调用 template<typename MemFn> using member_function_return_t = typename member_function_traits<MemFn>::return_type; int main() { Test x{123}; auto functionPointer = &Test::getValue; std::cout << typeid(x.m_value).name() << "\n"; // 输出 "i" std::cout << typeid(decltype(&Test::getValue)).name() << "\n"; // 输出 "M4TestFivE" std::cout << typeid(functionPointer).name() << "\n"; // 输出 "M4TestFivE" // 提取并输出返回类型 std::cout << typeid(member_function_return_t<decltype(functionPointer)>).name() << "\n"; // 输出 "i" return 0; }
方法二:使用std::invoke_result_t
利用C17引入并在C20中完善的std::invoke_result_t,结合类实例类型推导返回类型:
#include <iostream> #include <type_traits> // 需包含此头文件 class Test { public: Test(int value) : m_value{value} {} int getValue() {return m_value;} int m_value; }; int main() { Test x{123}; auto functionPointer = &Test::getValue; std::cout << typeid(x.m_value).name() << "\n"; // 输出 "i" std::cout << typeid(decltype(&Test::getValue)).name() << "\n"; // 输出 "M4TestFivE" std::cout << typeid(functionPointer).name() << "\n"; // 输出 "M4TestFivE" // 用invoke_result_t推导返回类型 using RetType = std::invoke_result_t<decltype(functionPointer), Test>; std::cout << typeid(RetType).name() << "\n"; // 输出 "i" return 0; }
说明
- 方法一的模板特化可直接解析成员函数指针类型,无需依赖类实例,适合单独处理成员函数指针类型的场景。
- 方法二的
std::invoke_result_t通过模拟调用成员函数(传入类实例类型)推导返回类型,代码更简洁,但需要明确类的实例类型。
内容的提问来源于stack exchange,提问作者Matt Young
相关产品推荐
相关产品推荐

