c++ - 如何在不重复代码的情况下使用 if-constexpr?

标签 c++ constexpr

目前我在做:

if constexpr(constexpr_bool_var1) {
    auto arg1 = costly_arg1(); auto arg2 = costly_arg2();
    if (costly_runtime_function(arg1, arg2)) {
        // do X, possibly more constexpr conditions
        // do Y
        // ...
    }
} else {
    // do X, possibly more constexpr conditions
    // do Y
    // ...
}

一种可能的方法是将 do X/Y 等转换为一个函数 doXY() 并在两个地方调用它,但是它看起来很笨拙,因为我必须编写一个函数,它只存在于方便元编程.

我想要的是这样的:

if not constexpr(constexpr_bool_var1 && some_magic(costly_runtime_function(arg1, arg2)) {
  // do X, do Y
} 

另一种方式是:

auto arg1 = costly_arg1(); // Unneeded extra work out not within constexpr
auto arg2 = costly_arg2();
if (constexpr_bool_var1 && costly_runtime_function(arg1, arg2)) {
} else {
    // do X, possibly more constexpr conditions
    // do Y
    // ...
}

但是这里 arg1 和 arg2 是在 if 条件之外声明的,因此它们将被不必要地实例化。

最佳答案

我不确定我是否正确理解了您的问题;您的原始代码和您的第二个替代方案不表达完全相同的功能(coSTLy_runtime_function 的含义从“做 X 和 Y”反转为“不做 X 和 Y”),并且在你提出的第一个替代方案我不明白你提出的语法是什么或者 some_magic 是什么。我正在用您的原始代码示例的语义来回答您的问题。

处理这个问题的最好方法可能是用一个标志来决定是否做 X 和 Y:

bool do_x_y = true;
if constexpr(constexpr_bool_var1) {
    // Maybe we don't actually want X and Y
    auto arg1 = costly_arg1(); auto arg2 = costly_arg2();
    do_x_y = costly_runtime_function(arg1, arg2);
}
if (do_x_y)  {
    // do X, possibly more constexpr conditions
    // do Y
    // ...
}

请注意,正如 Andrei R. points out在评论中,编译器可能无论如何都可以处理优化。不过,这让人类读者更清楚地知道您希望在编译时处理它。

关于c++ - 如何在不重复代码的情况下使用 if-constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46722147/

相关文章:

c++ - 初始化抛出异常的对象

c++ - 防止头文件中类实现的 "already defined"错误

c++ - 将 C++ LPCWSTR 打印到文件

c++ - 模板参数推导失败和函数参数/参数不匹配

c++ - 如何静态查询一个可能不存在的静态成员变量,提供一个默认值?

c++ - 局部constexpr变量引入了编译器错误

c++ - 在constexpr上下文中验证std::initializer_list

c++ - 从文本文件中读取对象

c++ - 编译错误:使用 constexpr 声明 std::array 大小

c++ - 为什么这个 constexpr if 不能编译