C++ 从函数返回更精确的两个模板参数?

标签 c++ templates

我很好奇是否有任何方法可以在 C++ 中执行此操作。假设我有一个模板化 vector 类:

template <typename T>
class vector {          
public:
      vector(T a, T b, T c) : x(a), y(b), z(c) {}

      T x,y,z;
};

然后我有一个模板化的加法运算符:

template <typename A, typename B> 
vector<A> operator +(const vector<A> &a, const vector<B> &b) { 
   return vector<A>(a.x+b.x, a.y+b.y, a.z+b.z); 
}

我很好奇是否可以修改该运算符,使结果是 A 和 B 两种类型中更精确的一种,除了手动对其进行特化之外。

例如:

vector<float>       + vector<double> would produce a vector<double>, 
vector<long double> + vector<float>  would produce a vector<long double>

我的猜测是 C++ 中没有对此的自动支持,但我想我会问。

最佳答案

库形式没有任何内置支持,但您可以使用条件 ( ?:) 运算符来实现。

在回复另一个答案时,Johannes Schaub 发布了 a promote<T, U> template这很好地总结了逻辑。使用模板,您应该能够编写:

template <typename A, typename B>  
vector< typename promote<A, B>::type >
operator+(const vector<A> &a, const vector<B> &b) 
{     
    return vector< typename promote<A, B>::type >(a.x+b.x, a.y+b.y, a.z+b.z);  
} 

关于C++ 从函数返回更精确的两个模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4866669/

相关文章:

c++ - 在 Visual Studio 2013 中编译静态库

c++ - 与 char[] 和 memcpy 有关的奇怪情况

c++ - 从区域创建 std::chrono::zoned_time 从函数参数创建时间

模板类中的 C++20 类外定义

c++ - 将 std::function* 传递给模板参数

c++ - 带 CMake 的 LLVM 地址 sanitizer

c++ - 重载多个运算符时出现“不匹配”错误

c++ - 配对可变参数模板(命名元组)

c++ - 公共(public) "using"= decltype(<private>)

c++ - 在构造函数中引用未初始化的对象