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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:32:47