【问题标题】:How can my code do one thing at compile-time, but another thing at run-time?我的代码如何在编译时做一件事,而在运行时做另一件事?
【发布时间】: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.

标签: c++ c++17 constexpr


【解决方案1】:

注意:特定于编译器的解决方案是可以接受的(尽管不太理想)。

让我们提一下最明显的:

gcc 自9.2.0 以来至少记录了__builtin_is_constant_evaluated()。

clang 自 clang-9 以来具有相同的内置函数。

【讨论】:

    猜你喜欢
    • 2012-08-31
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多