我的代码如何在编译时做一件事,而在运行时做另一件事?
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 以来具有相同的内置函数。
【讨论】:
以上是关于我的代码如何在编译时做一件事,而在运行时做另一件事?的主要内容,如果未能解决你的问题,请参考以下文章