c ++甚至更通用的运算符模板

时间:2011-09-26 12:44:03

标签: c++ templates operators

所以我刚学会了(谢谢你们)关于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)?

我打赌不是,但这会很好!

2 个答案:

答案 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); \
    }