C++中的编译时函数是什么?
What is compile time function in C++?
我在这里(在SO上(搜索了这个问题,据我所知,所有问题都假设什么是编译时函数,但初学者几乎不可能知道这意味着什么,因为知道的资源非常罕见。
我发现了一篇简短的维基百科文章,其中展示了如何通过在C++中编写前所未见的枚举来编写难以理解的代码,以及一个关于它未来的视频,但对此解释很少。
在我看来,有两种方法可以在C++中编写编译时函数
constexpr
template<>
我已经对它们进行了简短的介绍,但我不知道它们是如何出现在这里的。
谁能用一个足够好的例子来解释编译时函数,使其包含它的大多数相关功能?
在 cpp 中,正如您提到的,有两种方法可以在编译时评估代码 -constexpr
函数和template
元编程。
这些解决方案之间存在一些差异。template
选项较旧,因此受更多编译器支持。此外,template
保证在编译时进行评估,而constexpr
有点像内联 - 它只建议编译器可以在编译时做工作。对于templates
,参数通常通过模板参数列表传递,而constexpr
函数将参数作为常规函数(它们实际上是(。constexpr
函数的更好之处在于它们可以在运行时中作为常规函数调用。
现在的相似之处 - 必须在编译时评估它们的参数。因此,它们必须是其他编译时函数的文本或结果。
说了这么多,让我们看看编译时max
函数:
template<int a, int b>
struct max_template {
static constexpr int value = a > b ? a : b;
};
constexpr int max_fun(int a, int b) {
return a > b ? a : b;
}
int main() {
int x = 2;
int y = 3;
int foo = max_fun(3, 2); // can be evaluated at compile time
int bar = max_template<3, 2>::value; // is surely evaluated at compile time
// won't compile without compile-time arguments
// int bar2 = max_template<x, y>::value; // is surely evaluated at compile time
int foo = max_fun(x, y); // will be evaluated at runtime
return 0;
}
您已经看到的术语"编译时函数"不是一个C++结构,它只是在编译时计算东西(因此,函数(的想法(而不是在运行时或通过编译器外部的单独构建工具计算(。C++通过多种方式使这成为可能,您已经找到了其中两种:
模板确实可以用来计算任意的东西,这是一组称为"模板元编程"的技术。这主要是偶然的,因为它们根本不是为此目的而设计的,因此语法疯狂,并且与旧编译器作斗争。但在 C++03 及之前,这就是我们所拥有的一切。
在看到编译时计算的需求后,
constexpr
已在 C++11 中添加,并将它们带回更理智的领域。从那以后,它的工具带一直在扩展,只需在正确的位置处理constexpr
,就可以在编译时运行越来越多的正常代码。
人们还可以提到宏元编程,其中Boost.Preprocessor就是一个很好的例子。但它比老式的模板元编程更不稳定和令人憎恶的神秘,所以如果你有选择,你可能不想使用它。
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 这里的字符串函数是什么意思
- 这个函数是什么意思(我的英语sry)
- C++ 中的 use 函数是什么?
- C++中的编译时函数是什么?
- 使用 DnsQuery 或 getaddrinfo 的正确函数是什么?
- Lua 中看起来像表的函数是什么?
- "AfxIsValidAddress"函数的等效标准函数是什么?
- 子类的构造函数后跟冒号后的基类构造函数是什么意思?
- MFC 用于计算控件的高光、阴影等的算法或函数是什么?
- 具有多个非可选参数的转换构造函数是什么样子的?为什么它有意义
- 不确定 c++ 中的常量函数是什么
- 指针的最快散列函数是什么
- 注册用于提升io_service的每个对象的回调函数是什么?
- 在 g++ 中生成 "-L" 和 -rpath 标志的等效函数是什么
- Boost.Python中的dispatch函数和forwarding函数是什么意思
- 给定情况下的良好哈希函数是什么
- C++ 中的"导出函数"是什么意思?
- C++ std::unordered_map 中使用的默认哈希函数是什么