#include <iostream>
#include <type_traits>
// 模板类Vector
template <typename T, size_t N>
class Vector {
private:
T data[N];
public:
// 构造函数
Vector() {
for (size_t i = 0; i < N; ++i) {
data[i] = T();
}
}
// 带参数的构造函数
template <typename... Args>
Vector(T first, Args... args) : data{first, args...} {}
// 成员函数实现向量加法
Vector<T, N> operator+(const Vector<T, N>& other) const {
Vector<T, N> result;
for (size_t i = 0; i < N; ++i) {
result.data[i] = data[i] + other.data[i];
}
return result;
}
// 成员函数实现向量减法
Vector<T, N> operator-(const Vector<T, N>& other) const {
Vector<T, N> result;
for (size_t i = 0; i < N; ++i) {
result.data[i] = data[i] - other.data[i];
}
return result;
}
// 友元函数实现向量与标量的乘法
template <typename U>
friend Vector<typename std::common_type<T, U>::type, N> operator*(const Vector<T, N>& vec, U scalar);
// 友元函数实现向量与标量的乘法
template <typename U>
friend Vector<typename std::common_type<T, U>::type, N> operator*(U scalar, const Vector<T, N>& vec);
// 获取向量元素
T operator[](size_t index) const {
return data[index];
}
// 设置向量元素
T& operator[](size_t index) {
return data[index];
}
};
// 友元函数实现向量与标量的乘法
template <typename T, size_t N>
template <typename U>
Vector<typename std::common_type<T, U>::type, N> operator*(const Vector<T, N>& vec, U scalar) {
using result_type = typename std::common_type<T, U>::type;
Vector<result_type, N> result;
for (size_t i = 0; i < N; ++i) {
result[i] = static_cast<result_type>(vec[i]) * scalar;
}
return result;
}
// 友元函数实现向量与标量的乘法
template <typename T, size_t N>
template <typename U>
Vector<typename std::common_type<T, U>::type, N> operator*(U scalar, const Vector<T, N>& vec) {
return vec * scalar;
}
// 测试代码
int main() {
Vector<int, 3> v1(1, 2, 3);
Vector<int, 3> v2(4, 5, 6);
Vector<int, 3> v_add = v1 + v2;
Vector<int, 3> v_sub = v1 - v2;
Vector<double, 3> v_mul1 = v1 * 2.5;
Vector<double, 3> v_mul2 = 2.5 * v1;
std::cout << "向量加法结果: ";
for (size_t i = 0; i < 3; ++i) {
std::cout << v_add[i] << " ";
}
std::cout << std::endl;
std::cout << "向量减法结果: ";
for (size_t i = 0; i < 3; ++i) {
std::cout << v_sub[i] << " ";
}
std::cout << std::endl;
std::cout << "向量与标量乘法结果1: ";
for (size_t i = 0; i < 3; ++i) {
std::cout << v_mul1[i] << " ";
}
std::cout << std::endl;
std::cout << "向量与标量乘法结果2: ";
for (size_t i = 0; i < 3; ++i) {
std::cout << v_mul2[i] << " ";
}
std::cout << std::endl;
return 0;
}
- 模板类定义:
template <typename T, size_t N>
定义了一个模板类 Vector
,其中 T
表示向量元素的数据类型,N
表示向量的维度。
- 成员函数实现向量加法和减法:
operator+
和 operator-
分别实现了向量的加法和减法,返回一个新的向量。
- 友元函数实现向量与标量的乘法:
operator*
友元函数实现了向量与标量的乘法,考虑了类型转换,返回一个新的向量。
- 测试代码:在
main
函数中,创建了几个向量,并对其进行加法、减法和乘法运算,验证重载运算符的正确性。