C++模板函数推导返回类型及简化实现方法问询
问题
我尝试编写一个简单的模板函数,它接受一个可调用对象和两个int类型参数,返回调用该可调用对象的结果。请问如何让函数推导返回值类型,且能创建该类型的默认值?
目前已有如下可行实现:
template <typename Func> auto CallFunc(Func f, int a, int b) -> std::invoke_result_t<Func, int, int> { using return_type = std::invoke_result_t<Func, int, int>; if (a > 0) { return (f)(a, b); } return return_type{}; }
但该实现需两次推导返回类型,略显繁琐,是否存在更简洁的实现方式?
简洁实现方案
有几种方式可以简化实现,避免重复推导返回类型:
方式一:利用decltype直接推导(C++14及以上)
借助decltype直接获取可调用对象的返回类型,无需重复使用std::invoke_result_t:
#include <utility> template <typename Func> auto CallFunc(Func f, int a, int b) { if (a > 0) { return f(a, b); } return decltype(f(a, b)){}; }
decltype(f(a, b))仅做类型推导,不会实际执行函数调用,即使可调用对象不可拷贝也能正常工作。
方式二:模板参数预推导返回类型(C++11及以上)
将返回类型设为模板默认参数,只做一次推导:
#include <type_traits> template <typename Func, typename Ret = std::invoke_result_t<Func, int, int>> Ret CallFunc(Func f, int a, int b) { if (a > 0) { return f(a, b); } return Ret{}; }
通过模板默认参数将返回类型Ret与Func绑定,后续直接复用Ret即可。
方式三:C++20简化写法
如果使用C++20,可借助std::type_identity明确返回类型,同时让编译器自动推导默认值:
#include <utility> #include <type_traits> template <typename Func> auto CallFunc(Func f, int a, int b) -> std::type_identity_t<decltype(f(a, b))> { if (a > 0) { return f(a, b); } return {}; }
这里std::type_identity_t用于锁定返回类型,return {}会自动匹配该类型的默认构造对象。
内容的提问来源于stack exchange,提问作者WalderFrey
相关产品推荐
相关产品推荐

