C++模板语法大全
C++模板语法大全
1. 函数模板
基本语法
template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}
多类型参数
template <typename T, typename U>
auto add(T a, U b) -> decltype(a + b) {return a + b;
}
显式实例化
template int max<int>(int, int);
模板参数推导
auto result = max(5, 10); // 推导为int
2. 类模板
基本语法
template <typename T>
class Stack {
private:std::vector<T> elements;
public:void push(const T& element);T pop();
};
成员函数定义
template <typename T>
void Stack<T>::push(const T& element) {elements.push_back(element);
}
静态成员
template <typename T>
class MyClass {
public:static int count;
};template <typename T>
int MyClass<T>::count = 0;
3. 非类型模板参数
template <typename T, int size>
class Array {
private:T data[size];
public:T& operator[](int index);
};
4. 模板特化
全特化
template <>
class Stack<bool> {// 针对bool类型的特殊实现
};
偏特化
template <typename T>
class Stack<T*> {// 针对指针类型的特殊实现
};
5. 可变参数模板
template <typename... Args>
void print(Args... args) {(std::cout << ... << args) << '\n'; // 折叠表达式(C++17)
}
6. 模板别名
template <typename T>
using Vec = std::vector<T>;Vec<int> v; // 等价于 std::vector<int>
7. 模板约束(C++20)
概念(Concepts)
template <typename T>
concept Integral = std::is_integral_v<T>;template <Integral T>
T square(T x) {return x * x;
}
requires子句
template <typename T>
requires std::is_integral_v<T>
T increment(T x) {return x + 1;
}
8. 模板元编程
编译时计算
template <int N>
struct Factorial {static const int value = N * Factorial<N-1>::value;
};template <>
struct Factorial<0> {static const int value = 1;
};
SFINAE (替换失败不是错误)
template <typename T>
auto test(T x) -> decltype(x.serialize(), void()) {// 只有当T有serialize()方法时才匹配
}
9. 模板友元
template <typename T>
class MyClass {friend void foo(MyClass<T> obj) {// 可以访问MyClass的私有成员}
};
10. 模板默认参数
template <typename T = int, int size = 10>
class Buffer {// ...
};
11. 模板继承
template <typename T>
class Base {};template <typename T>
class Derived : public Base<T> {};
12. 模板与虚函数
template <typename T>
class Base {
public:virtual void process(T value) = 0;
};class Derived : public Base<int> {
public:void process(int value) override {}
};
13. 模板中的嵌套类型
template <typename T>
class Outer {
public:template <typename U>class Inner {// ...};
};
14. 模板模板参数
template <template <typename> class Container, typename T>
class Wrapper {Container<T> data;
};
15. Lambda表达式模板(C++20)
auto lambda = []<typename T>(T x) { return x * 2; };
16. 模板中的constexpr
template <typename T, int N>
constexpr int array_size(T (&)[N]) {return N;
}
17. 模板中的decltype和auto
template <typename T, typename U>
auto multiply(T x, U y) -> decltype(x * y) {return x * y;
}
18. 完美转发模板
template <typename T>
void wrapper(T&& arg) {process(std::forward<T>(arg));
}
19. 模板中的异常规范
template <typename T>
void func() noexcept(std::is_nothrow_copy_constructible_v<T>) {}
20. 模板中的静态断言
template <typename T>
void process(T value) {static_assert(std::is_integral_v<T>, "T must be integral");
}
这些是C++模板的主要语法和特性,涵盖了从基础到高级的用法。C++20引入的概念(Concepts)极大地改进了模板编程的可用性和错误消息的可读性。