我很好奇是否有办法在C中做到这一点.假设我有一个模板化的矢量类:
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>
解决方法
库中没有任何内置支持,但您可以使用条件(?:)运算符来完成此操作.
在回答另一个答案时,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.z+b.z); }