Так что я только что узнал (спасибо, ребята) о decltype. Теперь я могу написать действительно хорошие векторные шаблоны, которые на самом деле превосходят 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;
}
Можно ли сделать этот тип шаблонов еще более "мета" в том смысле, что мы позволяем самому оператору ("*") быть параметром шаблона? То есть иметь одно единственное определение шаблона, которое работает для *, +,% и т. д., где соответствующий оператор op используется в * c = (* a) op (* b)?
Держу пари, что это не так, но было бы неплохо!