如何根据函数返回类型自动推导函数模板参数?
问题描述
示例代码:
template<typename T> T get() { return T{}; } void test() { float f = get();//需要模板参数;例如 get<float>(); }已知
float可以转换为double甚至int,能否让get<T>根据所需返回类型自动实例化?若可以,该如何实现?
解决方案
可以实现,核心是给编译器提供推导模板参数T的依据(原函数无参数,编译器无法从返回值反向推导),以下是两种常用实现方式:
方法一:添加默认模板参数(C++11及以上)
给get函数添加一个默认构造的T类型参数,让编译器通过赋值目标类型推导T:
template<typename T> T get(T = {}) { return T{}; } void test() { float f = get(); // 编译器自动推导T为float int i = get(); // 自动推导T为int }
原理:调用get()时,默认参数T{}的类型会匹配赋值语句的目标类型,编译器据此推导出模板参数T。
方法二:利用类模板实参推导(C++17及以上)
通过类的转换运算符,让编译器根据目标类型推导类模板的参数:
template<typename T> struct Getter { operator T() const { return T{}; } }; auto get() { return Getter{}; } void test() { float f = get(); // 编译器推导Getter的T为float,触发转换运算符 double d = get();// 推导T为double }
原理:get()返回一个未指定模板参数的Getter对象,当赋值给目标类型时,编译器会尝试调用Getter<T>的转换运算符,从而推导出T的类型。
补充说明
- 若使用C++20及以上,还可以结合
auto返回类型和概念进一步简化,但上述两种方法已覆盖绝大多数场景。 - 注意如果目标类型存在隐式转换歧义(比如同时能匹配多个
T),编译器会报错,此时仍需显式指定模板参数。
内容的提问来源于stack exchange,提问作者PinkTurtle
相关产品推荐
相关产品推荐

