如何推导C++抽象类成员方法的返回类型?
提取抽象类非纯虚成员函数的返回类型
问题场景
给定抽象类A的定义:
class A { public: int foo(); virtual void other() = 0; };
由于foo()的返回类型可能被修改,需要一种可靠的方式提取其返回类型。直接用decltype(A().foo())会失败,因为抽象类无法实例化。
解决方法
方法1:用std::declval配合decltype
std::declval是C++11引入的工具,能在编译期生成指定类型的右值引用,无需实际实例化对象。用它来获取foo()的返回类型非常直接:
#include <utility> // 包含std::declval的头文件 using Foos_Return_Type = decltype(std::declval<A>().foo());
这是最简洁的方案,完全依赖标准库,代码可读性高。
方法2:通过成员函数指针+类型萃取
如果需要更底层的实现,或者不想引入<utility>头,可以先获取成员函数指针的类型,再通过模板萃取返回值:
// 自定义类型萃取模板 template <typename Func> struct get_return_type; template <typename Ret, typename Class> struct get_return_type<Ret (Class::*)()> { using type = Ret; }; // 使用方式 using Foos_Return_Type = get_return_type<decltype(&A::foo)>::type;
也可以用C++14的std::invoke_result_t简化萃取步骤:
#include <type_traits> using Foos_Return_Type = std::invoke_result_t<decltype(&A::foo), A*>;
这里decltype(&A::foo)是成员函数指针类型,A*表示调用该成员函数时需要的对象指针参数,std::invoke_result_t会自动推导出返回类型。
所有这些方法都是编译期操作,不会尝试创建抽象类A的实例,完全规避了抽象类无法实例化的限制。
内容的提问来源于stack exchange,提问作者dEmigOd
相关产品推荐
相关产品推荐

