【发布时间】:2021-03-06 07:27:31
【问题描述】:
我正在实现一个constexpr int foo(); 函数。在foo() 的正文中,我想在编译时做一些不同的事情(并且可能返回不同的东西),在运行时做一些不同的事情。
使用 C++20,我可以使用 std::is_constant_evaluated:
constexpr int foo() { return std::is_constant_evaluated() ? 123 : 456 };
但是如果我使用的是 C++17(或更早版本)怎么办 - 我可以用相同的效果做什么?
注意:特定于编译器的解决方案是可以接受的(尽管不太理想)。
【问题讨论】:
-
"你如何区分编译时和运行时两个独立的函数?" 我不会。我会编写一个只在编译时使用的函数,来完成需要在编译时完成的事情;另一个只在运行时使用,用于执行需要在运行时完成的不同事情。它们需要在不同的时间运行,也需要做不同的事情,所以我认为没有任何理由将它们视为相关。
-
@KarlKnechtel 另一个重要的部分是知道什么是可能的以及如何实现它
-
@KarlKnechtel 编程在很大程度上是关于知道什么时候不做事 如果是这样,
std::is_constant_evaluated就不会被创建。这有一些实际的用例,比如pow函数,如果可以计算 ate 编译时间,如果不能,则计算函数的运行时版本。在泛型代码中更是如此。 -
@KarlKnechtel:因为函数做同样的事情;但它需要在编译时和运行时以不同的方式发生,和/或具有不同的副作用。一个具体的例子:C++ 标准委员会论文P1668R1.