如何根据模板参数确定模板函数的返回类型?
实现模板函数返回类型依赖输入类型的方案
你的需求完全可以实现,根据不同的C++标准版本,有几种简洁的写法:
1. C++98及以上兼容写法
直接将返回类型指定为result_type<U, V>::type,注意用typename关键字告诉编译器这是依赖于模板参数的类型:
template<typename U, typename V> typename result_type<U, V>::type function() { // 函数体示例:返回对应类型的默认构造对象 return typename result_type<U, V>::type(); }
2. C++11及以上的后置返回类型写法
利用C++11引入的返回类型后置语法,写法更直观,尤其适合返回类型依赖函数参数的场景(无参模板函数同样适用):
template<typename U, typename V> auto function() -> typename result_type<U, V>::type { return typename result_type<U, V>::type{}; }
3. C++14及以上的自动返回类型推导
C++14支持自动推导函数返回类型,只要函数体内的return语句能推导出明确类型,编译器会自动匹配result_type定义的返回类型:
template<typename U, typename V> auto function() { using R = typename result_type<U, V>::type; return R{}; }
完整测试示例
结合你定义的result_type,完整可运行代码如下:
#include <complex> // 你的result_type特化定义 template<class U, class V> struct result_type { using type = U; }; template<> struct result_type<float, double> { using type = double; }; template<> struct result_type<double, float> { using type = double; }; // 补充std::complex的特化示例 template<typename T> struct result_type<std::complex<T>, std::complex<T>> { using type = std::complex<T>; }; template<> struct result_type<std::complex<float>, std::complex<double>> { using type = std::complex<double>; }; // C++11写法示例 template<typename U, typename V> auto function() -> typename result_type<U, V>::type { return typename result_type<U, V>::type{}; } int main() { // 验证不同参数组合的返回类型 double r1 = function<float, double>(); // 返回double double r2 = function<double, float>(); // 返回double int r3 = function<int, int>(); // 返回int std::complex<double> r4 = function<std::complex<float>, std::complex<double>>(); // 返回std::complex<double> return 0; }
内容的提问来源于stack exchange,提问作者ScratchingTheSurface
相关产品推荐
相关产品推荐

