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

求助:编写通用模板函数,通过maker函数泛型创建类型(编译失败)

问题分析

你的代码无法编译的核心原因是模板模板参数只能匹配类模板/别名模板,不能匹配函数模板。你试图传递的std::make_optional、std::make_unique都是函数模板,而非类模板,因此无法匹配template <typename, typename ...> typename Maker这个模板模板参数。

解决方案

根据你的需求,有两种简洁且可编译的实现方式:

方式1:C++17及以上 - 使用auto模板参数

利用C++17引入的auto模板参数直接捕获实例化后的函数指针,代码最简洁:

#include <memory>
#include <optional>

template <auto Maker>
auto create(int a, int b)
{
    return Maker(a + b);
}

int main()
{
    // 注意需要显式实例化Maker函数的模板参数(比如<int>)
    auto a = create<std::make_optional<int>>(1, 2);  // std::optional<int>
    auto b = create<std::make_unique<int>>(3, 4);    // std::unique_ptr<int>
    auto c = create<std::make_shared<int>>(10, 20);  // std::shared_ptr<int>
        
    return 0;
}

方式2:兼容C++14及更早 - 直接传递函数对象

不使用模板参数传递Maker,而是将实例化后的函数作为参数传入,兼容性更好:

#include <memory>
#include <optional>

template <typename MakerFunc>
auto create(MakerFunc maker, int a, int b)
{
    return maker(a + b);
}

int main()
{
    auto a = create(std::make_optional<int>, 1, 2);
    auto b = create(std::make_unique<int>, 3, 4);
    auto c = create(std::make_shared<int>, 10, 20);
        
    return 0;
}
补充说明

如果你希望更贴近最初的思路(传递模板而非实例化后的函数),可以改为传递类模板,然后内部调用对应的make_xxx函数,但这种方式需要针对不同类型做分支判断,灵活性稍差:

#include <memory>
#include <optional>
#include <type_traits>

template <template <typename...> typename Wrapper>
auto create(int a, int b) -> Wrapper<int>
{
    if constexpr (std::is_same_v<Wrapper<int>, std::optional<int>>)
    {
        return std::make_optional(a + b);
    }
    else if constexpr (std::is_same_v<Wrapper<int>, std::unique_ptr<int>>)
    {
        return std::make_unique<int>(a + b);
    }
    else if constexpr (std::is_same_v<Wrapper<int>, std::shared_ptr<int>>)
    {
        return std::make_shared<int>(a + b);
    }
}

int main()
{
    auto a = create<std::optional>(1, 2);
    auto b = create<std::unique_ptr>(3, 4);
    auto c = create<std::shared_ptr>(10, 20);
        
    return 0;
}

内容的提问来源于stack exchange,提问作者Patrick Wright

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:22:38