You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:37:38