跳至主要內容

LincZero大约 3 分钟

  1. C++11:
    1. (1) 可变参数模板:可以使模板函数接受任意数量的参数。
    2. (2) 智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr。
    3. (3) 移动语义:可以更有效地使用内存和处理器资源。
    4. (4) lambda函数:提供了一种更加简洁和高效的方式来定义本地函数。
    5. (5) 并行算法:可以在多核处理器上更有效地运行算法。
  2. C++14:
    1. (1) 泛型lambda:可以使用模板参数的lambda函数。
    2. (2) 可选参数和可变参数模板:可以更灵活地定义函数的参数。
    3. (3) 常量表达式:可以使用常量值来定义对象。
    4. (4) 初始化列表的繁琐:可以简化初始化列表的语法。
  3. C++17:
    1. (1) 新的for循环:可以使用新的范围for循环以更简洁的方式遍历容器。
    2. (2) 泛型算法:可以使用泛型算法来完成更复杂的任务。
    3. (3) 并发库:提供了一组API来支持并发编程。
    4. (4) 面向对象编程:引入了一组新的特性,如虚函数、抽象类、继承等,来支持面向对象编程。
  4. C++20:
    1. (1) 运算符重载:可以重载运算符以定义类型的新操作。
    2. (2) 模板字面量:可以定义模板字面量来表示常量值。
    3. (3) 模板别名:可以使用简单的语法来定义模板别名。
    4. (4) 模板参数包:可以使用参数包来传递任意数量的参数。
    5. (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 是一个模板类,用于计算阶乘。在这个模板类中,使用了递归和静态成员变量的方式来计算阶乘。这个模板类的计算是在编译期间完成的,因此可以在运行时节省计算时间。这个示例主要关注于在编译期间进行元编程和优化。

因此,模板编程和模板元编程的区别在于:模板编程主要关注代码的通用性和重用性,而模板元编程则更注重在编译期间对程序进行优化和计算。