【发布时间】:2017-11-17 05:01:10
【问题描述】:
使用表达式模板时,如何创建特化?从Wikipedia example,我可以像这样制作一个 Vector sum 模板类:
template <typename E1, typename E2>
class VecSum : public VecExpression<VecSum<E1, E2> > {
E1 const& _u;
E2 const& _v;
public:
VecSum(E1 const& u, E2 const& v) : _u(u), _v(v) {
assert(u.size() == v.size());
}
double operator[](size_t i) const { return _u[i] + _v[i]; }
size_t size() const { return _v.size(); }
};
template <typename E1, typename E2>
VecSum<E1,E2> const
operator+(E1 const& u, E2 const& v) {
return VecSum<E1, E2>(u, v);
}
根据 Wikipedia,如果我有一个扩展 VecExpression<Vector> 的 Vector 类和一个使用 [] 运算符和循环的 VecExpression 类的构造函数,这将允许循环合并,因此语句如下只使用一个循环:
Vector a = ...;
Vector b = ...;
Vector c = ...;
Vector d = a+b+c;
我明白为什么会这样,但我不确定如何将其扩展到标量。我希望能够向整个 Vector 添加一个标量(int、float 或 double),但我不确定如何执行此操作。我最好的猜测是为 VecSum 类创建专业化,例如:
template<typename E2> VecSum<int, E2>{ /*stuff goes here*/ }
template<typename E1> VecSum<E1, int>{ /*stuff goes here*/ }
template<typename E2> VecSum<float, E2>{ /*stuff goes here*/ }
template<typename E1> VecSum<E1, float>{ /*stuff goes here*/ }
template<typename E2> VecSum<double, E2>{ /*stuff goes here*/ }
template<typename E1> VecSum<E1, double>{ /*stuff goes here*/ }
但这似乎比必要的工作要多得多,还有其他解决方案吗?
【问题讨论】:
-
int + E2应该是什么意思?你认为它的operator[]应该是什么? -
@PasserBy 我不是很清楚。在每个 VecSum 特化中,在
operator[]代码中,我会简单地执行类似_u+_v[i]的操作,仅在非标量上使用[]。
标签: c++ templates expression-templates