现代C++(特别是从C++11开始)为模板编程引入了许多增强功能,这些增强大大提高了模板的表达力和灵活性。下面是一些关键的模板增强特性及其示例:
1. 变参模板(Variadic Templates)
变参模板允许创建接受任意数量参数的模板函数或类。
#include <iostream>
// 定义一个递归终止函数
void print() {
std::cout << "I'm the last one!" << std::endl;
}
// 变参模板函数
template<typename T, typename... Args>
void print(T first, Args... args) {
std::cout << first << ", ";
print(args...); // 递归调用
}
void variadicTemplates() {
print(1, 2.5, "hello", 'a');
}
2. 类型别名模板(Alias Template)
类型别名模板提供了一种定义模板类型别名的方式。
#include <vector>
#include <string>
template<typename T>
using Vec = std::vector<T>; // 类型别名模板
void aliasTemplate() {
Vec<int> intVec = {1, 2, 3, 4};
Vec<std::string> stringVec = {"hello", "world"};
}
3. 模板默认参数(Default Template Arguments)
就像普通函数一样,模板也可以有默认参数。
#include <iostream>
template<typename T = int>
class MyClass {
public:
T value;
void display() { std::cout << value << std::endl; }
};
void defaultTemplateArguments() {
MyClass<> myInt; // 使用默认类型int
myInt.value = 5;
myInt.display(); // 输出5
MyClass<std::string> myString;
myString.value = "Hello";
myString.display(); // 输出Hello
}
4. 模板模板参数(Template Template Parameters)
模板模板参数允许模板接受另一个模板作为参数。
#include <vector>
#include <iostream>
template<typename T, template<typename> class Container>
class MyClass {
public:
Container<T> data;
void display() {
for (auto& elem : data) {
std::cout << elem << " ";
}
std::cout << std::endl;
}
};
void templateTemplateParameters() {
MyClass<int, std::vector> myClass;
myClass.data = {1, 2, 3, 4};
myClass.display(); // 输出1 2 3 4
}
5. 尾返回类型推断(Trailing Return Type)
对于复杂的返回类型,尾返回类型可以提供更清晰的语法。
#include <map>
#include <string>
template<typename T, typename U>
auto findValue(const std::map<T, U>& m, const T& key) -> decltype(m.find(key)->second) {
return m.find(key)->second;
}
void trailingReturnType() {
std::map<std::string, int> myMap = {{"one", 1}, {"two", 2}};
std::cout << findValue(myMap, "two") << std::endl; // 输出2
}