표현 템플릿을 사용할 때 전문화는 어떻게 작성합니까? 내가 VecExpression<Vector>
를 확장하는 Vector
클래스와 []
연산자와 루프를 사용하는 VecExpression
클래스의 생성자가있는 경우, 위키 백과에 따르면특정 유형에 대해 expression-templates를 사용하는 방법은 무엇입니까?
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 example에서, 나는 벡터의 합 템플릿 클래스과 같이 할 수 있습니다 이 작품 왜
Vector a = ...;
Vector b = ...;
Vector c = ...;
Vector d = a+b+c;
내가 얻을,하지만 난 스칼라로 확장하는 방법을 잘 모르겠어요 :이 루프 그래서 다음과 같은 경우에만 사용 단일 루프와 같은 문을 병합 수 있습니다. 전체 벡터에 스칼라 (int, float 또는 double)를 추가 할 수 있기를 원하지만이 작업을 수행하는 방법을 모르겠습니다. 다른 해결책이있다,
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*/ }
을하지만이 필요한 것보다 그것의 더 많은 작품처럼 보인다 : 내 추측은 같은 VecSum 클래스에 대한 전문화를 만드는 것입니다?
'int + E2'는 무엇을 의미합니까? 그 연산자는 무엇이라고 생각합니까? –
@PasserBy 나는 그것에 대해 아주 분명하지 않았습니다. 각각의 VecSum 전문화에서,'operator []'코드에서, 나는 단지'_u + _v [i]'와 같은 것을 할 것이고, 단지 비 스칼라에'[]'만을 사용할 것입니다. – BadProgrammer99