我的代码如何在编译时做一件事,而在运行时做另一件事?

Posted

技术标签:

【中文标题】我的代码如何在编译时做一件事,而在运行时做另一件事?【英文标题】:How can my code do one thing at compile-time, but another thing at run-time? 【发布时间】:2020-11-23 14:57:58 【问题描述】:

我正在实现一个constexpr int foo(); 函数。在foo() 的正文中,我想在编译时做一些不同的事情(并且可能返回不同的东西),在运行时做一些不同的事情。

使用 C++20,我可以使用 std::is_constant_evaluated:

constexpr int foo()  return std::is_constant_evaluated() ? 123 : 456 ;

但是如果我使用的是 C++17(或更早版本)怎么办 - 我可以用相同的效果做什么?

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

【问题讨论】:

相关/欺骗:***.com/questions/46919582/… "你如何区分编译时和运行时两个独立的函数?" 我不会。我会编写一个只在编译时使用的函数,来完成需要在编译时完成的事情;另一个只在运行时使用,用于执行需要在运行时完成的不同事情。它们需要在不同的时间运行,也需要做不同的事情,所以我认为没有任何理由将它们视为相关。 @KarlKnechtel 另一个重要的部分是知道什么是可能的以及如何实现它 @KarlKnechtel 编程在很大程度上是关于知道什么时候不做事 如果是这样,std::is_constant_evaluated 就不会被创建。这有一些实际的用例,比如pow 函数,如果可以计算 ate 编译时间,如果不能,则计算函数的运行时版本。在泛型代码中更是如此。 @KarlKnechtel:因为函数做同样的事情;但它需要在编译时和运行时以不同的方式发生,和/或具有不同的副作用。一个具体的例子:C++ 标准委员会论文P1668R1. 【参考方案1】:

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

让我们提一下最明显的:

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

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

【讨论】:

以上是关于我的代码如何在编译时做一件事,而在运行时做另一件事?的主要内容,如果未能解决你的问题,请参考以下文章

如何持续做一件事

有思考,有行动就是成功的关键

浅析BIONIOAIO

单击按钮时如何将文本视图从一件事切换到另一件事 - Android

Javascript 复选框 onChange

Python基础之if判断,while循环,循环嵌套