@cyberpunk_正在尝试实现某些目标并对此提出了一些问题,但所有的追逐都归结为:
是否可以构建一个工具来强制对constexpr
函数进行编译时评估?
int f(int i) {return i;}
constexpr int g(int i) {return i;}
int main()
{
f(at_compilation(g, 0));
int x = at_compilation(g, 1);
constexpr int y = at_compilation(g, 2);
}
在所有情况下,at_compilation
强制对g
.
at_compilation
不需要是这种形式。
要求
- 允许任何(数字本机)文字类型作为 constexpr 函数的输入。
- 这也可以根据函数参数类型进行硬编码。
- 允许任何(数字本机)文字类型作为输出,这是 constexpr 函数调用的结果。
- 这也可以根据函数返回类型进行硬编码。
愿望
- 减少宏的使用,但不要害怕使用。
- 是通用的(不是硬编码的类型)。
- 支持任何文字类型。最后,任何数字本机文字类型都是必需的。
相关问题:
- constexpr 函数何时在编译时进行评估?
- 强制在编译时评估常量表达式?
- 将任何函数作为模板参数传递?
- 它在 C++11 标准中的什么地方指定了在翻译过程中何时可以评估 constexpr 函数?
带有相关代码示例的答案:
所有代码示例都有关于要求的限制。
清楚地解释这在 C++ 中是如何不可行的也是一个很好的答案。
我怀疑这是不可能的基于@K-ballo / @Herb Sutter的 回答,其中指出“并且结果也用于常量表达式”。这不是我以前关于constexpr
函数的概念的一部分,我首先认为只需将文字(或其他编译时输入)作为参数传递就足以保证(按标准)它在编译时被评估。
已经假设 constexpr 函数的目的是它们可以在必要时适合常量表达式情况,例如在数组边界中。没关系。鉴于此,这个问题是关于将它们用作编译时间计算的工具的黑客攻击。不管是好事还是坏事,都无关紧要。