能否更简洁地指定该C++模板函数的返回类型?
更简洁的返回类型指定方式
针对你给出的模板函数,有两种更简洁的方式来指定返回类型:
1. 用C++14的std::invoke_result_t简化类型声明
C++14为std::invoke_result<F, Args...>::type提供了别名std::invoke_result_t<F, Args...>,可以直接替换原代码中的冗长写法,让返回类型更紧凑:
template <typename F> requires std::invocable<F, Client&> auto run(const F& f) -> Result<std::invoke_result_t<F, Client&>> { try { return f(get_client()); } catch (Exception &e) { return e.error(); } }
2. C++20及以后:直接用自动返回类型推导
因为已经通过std::invocable<F, Client&>约束确保了仿函数f可以接受Client&调用,且函数体内两个return语句的类型兼容(f(get_client())能隐式转换为Result<T>,e.error()直接返回Result<T>),所以可以完全省略尾部返回类型,直接用auto让编译器自动推导:
template <typename F> requires std::invocable<F, Client&> auto run(const F& f) { try { return f(get_client()); } catch (Exception &e) { return e.error(); } }
编译器会自动推导出返回类型为Result<std::invoke_result_t<F, Client&>>,和原代码的返回类型完全一致。
注意:如果项目基于C11,那只能保留原写法;std::invoke_result_t需要C14及以上支持,自动返回类型推导(模板函数无尾部返回类型)则需要C++20及以上。
内容的提问来源于stack exchange,提问作者Hesky Fisher
相关产品推荐
相关产品推荐

