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

如何获取类成员方法的返回类型?尝试std::result_of未果

正确获取类成员方法返回类型的几种方式

你的代码出错是因为std::result_of_t要求传入可调用对象的完整调用形式,而非静态成员函数不能直接写成Foo::foo()——它必须依附于Foo的实例,隐含需要一个对象作为第一个参数。

以下是几种可行的解决方法:

方法1:修正std::result_of_t的用法

通过成员函数指针结合对象(或对象指针)的形式,满足std::result_of_t的调用格式要求:

#include <type_traits>

class Foo
{
public:
    int foo();
};

int main() 
{
    // 传入成员函数指针 + Foo对象
    using return_type = std::result_of_t<decltype(&Foo::foo)(Foo)>;
    // 或者传入成员函数指针 + Foo指针
    using return_type2 = std::result_of_t<decltype(&Foo::foo)(Foo*)>;
    return 0;
}

方法2:使用C++17推荐的std::invoke_result_t

std::result_of在C++17中已被弃用,std::invoke_result_t的语义更清晰,用法类似:

#include <type_traits>

class Foo
{
public:
    int foo();
};

int main() 
{
    // 传入成员函数指针 + Foo对象
    using return_type = std::invoke_result_t<decltype(&Foo::foo), Foo>;
    // 或者传入成员函数指针 + Foo指针
    using return_type2 = std::invoke_result_t<decltype(&Foo::foo), Foo*>;
    return 0;
}

方法3:直接用decltype推导(最简便)

借助std::declval在编译期生成临时对象,直接推导调用成员函数后的返回类型:

#include <type_traits>

class Foo
{
public:
    int foo();
};

int main() 
{
    using return_type = decltype(std::declval<Foo>().foo());
    return 0;
}

关键说明

  • 非静态成员函数的类型是返回值类型 (类名::*)(),调用时必须绑定到类的实例(对象或指针)。
  • std::declval<T>()仅用于编译期类型推导,不会生成实际的对象,无需T具备可访问的构造函数。

内容的提问来源于stack exchange,提问作者mouse_00

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:24:57