如何利用函数返回类型实现类模板实参推导
类模板实参推导(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
相关产品推荐
相关产品推荐

