0

我很好奇:如果有纯D函数,可以在编译时计算。

如果我不想编译时计算纯函数,而是在运行时计算,怎么办?

例子:

static int result = f();

f是一个纯函数,我希望它在运行时计算。

4

1 回答 1

2

仅供参考,并非所有纯函数都可以在编译时计算,并且纯函数不需要编译时运行。他们实际上几乎没有什么关系。

尝试对任何函数进行编译时函数评估,但仅在必须进行时。这是由上下文决定的——编译时必​​须有答案吗?这适用于:

  • 枚举值
  • 静态初始化器
  • 静态 if 条件
  • 静态 foreach 参数
  • 模板参数

如果您因此在运行时需要它,只需在这些上下文之一之外调用它。

static int result = f();

上面是一个静态初始化器,因此是 CTFE。


static int result;
result = f();

这不再是静态初始化器,因此也不再是 CTFE。为了防止它被调用两次,您可以if使用特殊值对其进行常规检查,这意味着它尚未运行或使用单独的 bool 标志。

如果这是在模块范围内,请使用构造函数:

static int result;
static this() { result = f(); }
于 2019-01-20T14:51:49.980 回答