#include <iostream>
#include <string>
#include <vector>
template<typename T>
struct S {
T val;
S() {}
S(T value) : val(value) {}
T& get() { return val; }
const T& get() const { return val; }
S<T>& operator=(const T& value) {
val = value;
return *this;
}
};
template<typename T>
void read_val(T& v) {
std::cin >> v;
}
template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
os << "{ ";
for (const auto& val : vec) {
os << val << ", ";
}
os << "}";
return os;
}
template<typename T>
std::istream& operator>>(std::istream& is, std::vector<T>& vec) {
char ch;
T val;
is >> ch; // Read '{'
while (is >> val) {
vec.push_back(val);
is >> ch; // Read ',' or '}'
if (ch == '}') {
break;
}
}
return is;
}
int main() {
S<int> s1(10);
S<char> s2('A');
S<double> s3(3.14);
S<std::string> s4("Hello");
S<std::vector<int>> s5({1, 2, 3, 4});
std::cout << s1.get() << std::endl;
std::cout << s2.get() << std::endl;
std::cout << s3.get() << std::endl;
std::cout << s4.get() << std::endl;
std::cout << s5.get() << std::endl;
read_val(s1.get());
read_val(s2.get());
read_val(s3.get());
read_val(s4.get());
std::cout << s1.get() << std::endl;
std::cout << s2.get() << std::endl;
std::cout << s3.get() << std::endl;
std::cout << s4.get() << std::endl;
std::vector<int> vec;
read_val(vec);
S<std::vector<int>> s6(vec);
std::cout << s6.get() << std::endl;
return 0;
}
定义了一个类模板 S,其中包含一个成员变量 val。
添加了构造函数,使得能够对 T 进行初始化。
定义了 S<int> s1(10)、S<char> s2('A')、S<double> s3(3.14)、S<std::string> s4("Hello") 和 S<std::vector<int>> s5({1, 2, 3, 4}),并对其进行初始化。
读取并打印了上述变量的值。
添加了成员函数 get(),该函数返回对 val 的引用。
在类外部编写了 get() 的定义。
将 val 设为私有成员。
通过 get() 函数完成了练习4中的任务。
添加了函数模板 operator=(const T&),取代了 set() 函数。
编写了 get[] 的 const 版本和非 const 版本。
定义了函数模板 read_val(T& v),该函数能够将 cin 中读取的值写入 v。
通过 read_val() 读取值,存入练习3中前四个变量。
加分题: 为 vector<T> 定义输入和输出运算符 (>> 和 <<)。这两个运算符都使用 {val, val, val, val} 格式。这使得 read_val() 也能处理 S<vector<int>> 变量。