在 C++ 元编程中是否全部使用模板?

joa*_*erl 11 c++ templates metaprogramming template-meta-programming

我试图了解元编程是通用的,特别是在 C++ 中是什么。如果我搜索 c++ 元编程,我会得到模板元编程 (TMP) 的教程,但没有解释它是否只对模板的特定用途或模板的所有用途进行分类。

我的问题是 C++ 中模板的所有用法是否都归类为元编程。解释为什么它是或不是也会有帮助。谢谢你。

max*_*x66 6

我的问题是 C++ 中模板的所有用法是否都被归类为元编程。

不。

在 C++ 中,并非所有模板的用法都是元编程。

显然这是一个定义问题,但在 C++ 中,“元编程”是“编译时计算”的同义词。

因此,我们使用模板进行元编程(特别是模板元编程),但并非所有模板的使用都是元编程。

一个简单的反例

template <typename K, typename V>
void printKeyVal (K const & k, V const & v)
 { std::cout << k << ": " << v << std::endl; }
Run Code Online (Sandbox Code Playgroud)

前面printKeyVal()是一个模板函数,它将几个通用值打印到标准输出(因此是运行时,而不是编译时)。

它无法运行编译时,因此它是“模板”,但不是“元编程”。

更一般地说:std::vector是一个使用内存分配的模板类。并且内存分配(C++17 之前;也许将来可能会有所不同)不能在编译时代码中使用。

因此std::vector(与std::array此相反,具有固定大小,不使用内存分配)是不能用于元编程的模板功能(当使用涉及对象的实例化时std::vector)。


Xat*_*ian -1

当使用模板编写 C++ 函数时,您正在为编译器编写“指令”,告诉它在遇到函数调用时要做什么。从这个意义上说,您并不是直接编写代码,因此我们将其称为元编程。

所以是的,每个涉及模板的 C++ 代码都被视为元编程

请注意,只有定义模板函数或类的部分是元编程。常规函数和类被归类为常规 C++!