c ++广义运算符模板

时间:2011-09-26 12:08:59

标签: c++ templates operators overloading

我正在做一些数值模拟,在向量上重载操作很好(类似于valarrays)。例如,我可以写

template <typename T>
vector<T> operator*(const vector<T>& A, const vector<T>& B){
   //blah blah
}

但是如果我想概括这个模板以便对两种不同类型的向量进行操作并且(可能)返回第三种类型呢?即我想写

template <typename T, template U, template V>
vector<V> operator*(const vector<T>& A, const vector<U>& B){
   //blah blah
}

现在,如果我在情况“A * B”中使用运算符,其中A和B是不同类型并返回另一种不同类型,则上述确实有效。但是,如果A和B的类型相同,则不起作用。当然,我可以为每个组合定义不同的模板(即仅T,或仅T和U,或T,U和V),但这看起来很难看。有没有办法可以使用上面给出的T,U和V种的单个模板表达式,即使“A”,“B”和“A * B”都是相同的类型(或者有)只有2种不同的类型?)

3 个答案:

答案 0 :(得分:1)

  

现在,如果我在某种情况下使用运算符,上面确实有效   “A * B”,其中A和B是不同的,并返回不同的类型。

说实话,这没有意义。您的模板根本不起作用,因为无法推断出V,它是第三个模板参数。如果你写了:

template <typename V, template T, template U>
vector<V> operator*(const vector<T>& A, const vector<U>& B){
   //blah blah
}

这将“有效”,但前提是您明确指定了V,例如

operator*<double>(A, B); //where A is vector<int> and B is vector<float>, for example

当然,您想要返回vector<V>,其中V是表达式T()*U()的类型。这可以在C ++ 11中实现,但在C ++ 03中并不是那么简单(我的意思是,你最好能做一些类型特征)。以下是它在C ++ 11中的完成方式:

template <typename T, template U>
vector<decltype(T()*U())> operator*(const vector<T>& A, const vector<U>& B)  
{
   //blah blah
}

HTH

答案 1 :(得分:0)

这可以在带有decltype的C ++ 0x中使用。

template <typename T, template U> 
vector<decltype(declval<T>() + declval<U>())> 
operator*(const vector<T>& A, const vector<U>& B){
   //blah blah
}

不使用这种机制 - 并假设T和U不提供自己的机制 - 你不能做这样的事情。您只能处理T,U和返回类型都是相同类型的情况。但是,您可以处理原始类型 - 将+等运算符应用于各种基本类型以查找提升类型的结果存在Boost类型特征。

答案 2 :(得分:0)

正如其他人指出的那样,您可以使用decltype来实现这一目标。 C ++ 0x还提供了模板common_type,该模板推导出一种类型,在没有任何特定算术运算的情况下,所有模板参数都可以被强制转换。因此,如果没有重载运算符可用于参数类型,也可以使用它。