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

如何利用函数返回类型实现类模板实参推导

类模板实参推导(CTAD):省略模板参数构造实例的解决方案

你要的写法在C++17及以后版本完全可行,对应的技术叫做类模板实参推导(Class Template Argument Deduction,CTAD)——编译器会根据上下文(比如函数返回类型、变量声明类型)自动推导模板参数的类型,无需手动显式指定。

单模板参数场景

修正并验证你的示例代码如下:

#include <iostream>
#include <typeinfo>

template <typename T>
class Class
{
public:
    Class()
    {
        std::cout << "构造的实例模板类型:" << typeid(T).name() << std::endl;
    };
};

Class<int> Function()
{
    return Class(); // 编译器根据返回值类型Class<int>,自动推导T=int
}

int main()
{
    Class<int> instance = Function();
    return 0;
}

编译运行后,会输出对应int类型的构造信息,证明推导有效。

多模板参数场景

CTAD同样支持多模板参数的情况,只要编译器能从上下文明确所有参数的类型:

#include <iostream>
#include <typeinfo>
#include <string>

template <typename T, typename U>
class MultiClass
{
public:
    MultiClass()
    {
        std::cout << "构造的实例模板类型:T=" << typeid(T).name() 
                  << ",U=" << typeid(U).name() << std::endl;
    };
};

MultiClass<int, std::string> MultiFunction()
{
    return MultiClass(); // 编译器根据返回值类型推导T=int,U=std::string
}

int main()
{
    MultiClass<int, std::string> mc = MultiFunction();
    return 0;
}

注意:如果是直接通过默认构造初始化变量(而非通过函数返回值推导),比如Class instance;,编译器无法自动推导模板参数,此时需要显式指定或添加推导指引来辅助编译器推导。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:35:35