所以我刚学会了(谢谢你们)关于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)?
我打赌不是,但这会很好!
答案 0 :(得分:2)
正如您所料,这个答案是“不”。 :)
但是,您可以使用预处理器生成此类函数:
#define OPERATOR_BLOB(optype) \
vector<…> operator optype (…) { … }
OPERATOR_BLOB(*)
OPERATOR_BLOB(+)
…
答案 1 :(得分:0)
使用std::declval<T&&>()
而不仅仅是T()
,它可能没有默认构造函数(因为std :: vector不需要默认构造函数,只需要复制构造函数)。此外,非常肯定关于类型&amp;参考&amp;右值引用正确性和转发,类可以对值,引用,const引用,右值引用以不同的方式实现。用几个班来测试它。
另外,请注意,由于未实现的功能,返回类型提取可能不适用于GCC中的复合赋值运算符。
是的,我在指针包装类中使用参数化宏解决了它:http://frigocoder.dyndns.org/code/Frigo/Lang/ref
例如
#define PROXY_BINARY_OPERATOR(_) \
template <class Arg> \
decltype(std::declval<T&&>() _ std::declval<Arg&&>()) operator _ (Arg&& arg) \
{ \
return std::forward<T>(get()) _ std::forward<Arg>(arg); \
} \
template <class Arg> \
decltype(std::declval<const T&&>() _ std::declval<Arg&&>()) operator _ (Arg&& arg) const \
{ \
return std::forward<T>(get()) _ std::forward<Arg>(arg); \
}