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

能否更简洁地指定该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:52:44