繁体   English   中英

c ++广义运算符模板

[英]c++ generalized operator templating

我正在做一些数值模拟,在向量上重载操作很好(类似于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种不同的类型?)

现在,如果我在“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

这可以在带有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类型特征。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM