大约 3 分钟
- C++11:
- (1) 可变参数模板:可以使模板函数接受任意数量的参数。
- (2) 智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr。
- (3) 移动语义:可以更有效地使用内存和处理器资源。
- (4) lambda函数:提供了一种更加简洁和高效的方式来定义本地函数。
- (5) 并行算法:可以在多核处理器上更有效地运行算法。
- C++14:
- (1) 泛型lambda:可以使用模板参数的lambda函数。
- (2) 可选参数和可变参数模板:可以更灵活地定义函数的参数。
- (3) 常量表达式:可以使用常量值来定义对象。
- (4) 初始化列表的繁琐:可以简化初始化列表的语法。
- C++17:
- (1) 新的for循环:可以使用新的范围for循环以更简洁的方式遍历容器。
- (2) 泛型算法:可以使用泛型算法来完成更复杂的任务。
- (3) 并发库:提供了一组API来支持并发编程。
- (4) 面向对象编程:引入了一组新的特性,如虚函数、抽象类、继承等,来支持面向对象编程。
- C++20:
- (1) 运算符重载:可以重载运算符以定义类型的新操作。
- (2) 模板字面量:可以定义模板字面量来表示常量值。
- (3) 模板别名:可以使用简单的语法来定义模板别名。
- (4) 模板参数包:可以使用参数包来传递任意数量的参数。
- (5) 内联变量:可以定义内联变量,其值可以在编译时被确定。
Q:用代码示例说明模板元编程和模板编程的区别
A:下面是一个简单的代码示例,演示了模板编程和模板元编程的区别:
#include <iostream>
#include <type_traits>
// 模板编程示例
template <typename T>
T add(T a, T b) {
return a + b;
}
// 模板元编程示例
template <int N>
struct factorial {
static constexpr int value = N * factorial<N - 1>::value;
};
template <>
struct factorial<0> {
static constexpr int value = 1;
};
int main() {
// 模板编程示例
std::cout << add(1, 2) << std::endl;
std::cout << add(1.0, 2.0) << std::endl;
// 模板元编程示例
std::cout << factorial<5>::value << std::endl;
std::cout << factorial<10>::value << std::endl;
std::cout << factorial<0>::value << std::endl;
// std::cout << factorial<-1>::value << std::endl; // 编译时错误:无法实例化负数的阶乘
return 0;
}
在上述代码中,add
是一个模板函数,可以接受任意类型的参数。这个函数主要关注于代码的通用性和重用性,通过模板实现了对不同类型的支持。
而 factorial
是一个模板类,用于计算阶乘。在这个模板类中,使用了递归和静态成员变量的方式来计算阶乘。这个模板类的计算是在编译期间完成的,因此可以在运行时节省计算时间。这个示例主要关注于在编译期间进行元编程和优化。
因此,模板编程和模板元编程的区别在于:模板编程主要关注代码的通用性和重用性,而模板元编程则更注重在编译期间对程序进行优化和计算。