C++ 模板函数
C++ template functions
此 Vec 模板支持多种功能,例如将向量乘以标量以及将向量与另一个向量相加。
让我困惑的是,为什么第二个 operator*
的重载在 class 模板之外?
在 class 中声明的 operator*
重载 vectorXscalar
外面声明的支持scalarXvector
template <class T>
class Vec {
public:
typename list<T>::const_iterator begin() const {
return vals_.begin();
}
typename list<T>::const_iterator end() const {
return vals_.end();
}
Vec() {};
Vec(const T& el);
void push_back(T el);
unsigned int size() const;
Vec operator+(const Vec& rhs) const;
Vec operator*(const T& rhs) const; //here
T& operator[](unsigned int ind);
const T& operator[](unsigned int ind) const;
Vec operator,(const Vec& rhs) const;
Vec operator[](const Vec<unsigned int>& ind) const;
template <class Compare>
void sort(Compare comp) {
vals_.sort(comp);
}
protected:
list<T> vals_;
};
template <class T>
Vec<T> operator*(const T& lhs, const Vec<T>& rhs); //and here!
template <class T>
ostream& operator<<(ostream& ro, const Vec<T>& v);
在模板 class 内声明的 operator*
同样可以在 class 外写成
template <class T>
Vec<T> operator*(const Vec<T>& lhs, const T& rhs);
它可以写在 class 里面,只有一个参数(代表 rhs),因为有隐含的 *this
参数用作运算符的 lhs。
与定义在class外的operator*
不同的是运算符的lhs是模板类型。这允许在使用运算符时以任何方式提供参数。
您可以在 class 之外使用任意 lhs 和 rhs 类型定义运算符,但在 class 内仅限于改变 rhs。给定参数类型,编译器将 select 任何定义的 operator*
的最佳匹配。
此 Vec 模板支持多种功能,例如将向量乘以标量以及将向量与另一个向量相加。
让我困惑的是,为什么第二个 operator*
的重载在 class 模板之外?
在 class 中声明的 operator*
重载 vectorXscalar
外面声明的支持scalarXvector
template <class T>
class Vec {
public:
typename list<T>::const_iterator begin() const {
return vals_.begin();
}
typename list<T>::const_iterator end() const {
return vals_.end();
}
Vec() {};
Vec(const T& el);
void push_back(T el);
unsigned int size() const;
Vec operator+(const Vec& rhs) const;
Vec operator*(const T& rhs) const; //here
T& operator[](unsigned int ind);
const T& operator[](unsigned int ind) const;
Vec operator,(const Vec& rhs) const;
Vec operator[](const Vec<unsigned int>& ind) const;
template <class Compare>
void sort(Compare comp) {
vals_.sort(comp);
}
protected:
list<T> vals_;
};
template <class T>
Vec<T> operator*(const T& lhs, const Vec<T>& rhs); //and here!
template <class T>
ostream& operator<<(ostream& ro, const Vec<T>& v);
在模板 class 内声明的 operator*
同样可以在 class 外写成
template <class T>
Vec<T> operator*(const Vec<T>& lhs, const T& rhs);
它可以写在 class 里面,只有一个参数(代表 rhs),因为有隐含的 *this
参数用作运算符的 lhs。
与定义在class外的operator*
不同的是运算符的lhs是模板类型。这允许在使用运算符时以任何方式提供参数。
您可以在 class 之外使用任意 lhs 和 rhs 类型定义运算符,但在 class 内仅限于改变 rhs。给定参数类型,编译器将 select 任何定义的 operator*
的最佳匹配。