所以我刚刚学习了(感谢大家)有关 decltype 的知识。我现在可以编写非常好的 vector 模板,实际上优于 valarrays(!):
template <typename T, typename U>
vector<decltype(T()*U())> operator*(const vector<T>& A, const vector<U>& B){
vector<decltype(T()*U())> C = vector<decltype(T()*U())>(A.size());
typename vector<T>::const_iterator a = A.begin();
typename vector<U>::const_iterator b = B.begin();
typename vector<decltype(T()*U())>::iterator c = C.begin();
while (a!=A.end()){
*c = (*a) + (*b);
a++; b++; c++;
}
return C;
}
在我们允许运算符(“*”)本身成为模板参数的意义上,是否有可能使这种模板更加“元”? IE。有一个适用于 *、+、% 等的单一模板定义,其中在 *c = (*a) op (*b) 中使用适当的运算符 op?
我敢打赌它不是,但它会很好!
最佳答案
如您所料,答案是否定的。 :)
但是,您可以使用预处理器生成这样的函数:
#define OPERATOR_BLOB(optype) \
vector<…> operator optype (…) { … }
OPERATOR_BLOB(*)
OPERATOR_BLOB(+)
…
关于C++甚至更通用的运算符模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555255/