【问题标题】:if constexpr(condition) as compile-time conditionalif constexpr(condition) 作为编译时条件
【发布时间】:2017-04-19 12:44:24
【问题描述】:

我想使用 constexpr bool(以下示例中的useF)来启用以下代码中的功能。在这里,打电话给A::f()。此外,在我关闭该功能的情况下,我希望将别名模板 (a) 变为 void

我尝试使用 constexpr if 语句,但主体仍在被实例化,这会导致编译错误。如果我使用包装器模板 (X),则正文将按我的预期被丢弃,但这对我来说似乎很难看。有没有其他方法可以做到这一点?

constexpr bool useF = false;

struct A {
    static void f() {}
};

using a = std::conditional<useF, A, void>::type;

template<typename L>
struct X {
    static void h() {
        if constexpr(std::is_same<L, A>::value) {
            L::f(); // not instantiated, no error
        }
    }
};

int main() {
    if constexpr(useF) {
        a::f(); // error!?
    }

    X<a>::h();
}

我正在使用带有 -std=c++17 的 g++-7.0.1

【问题讨论】:

  • 抱歉,标签选择错误!如果我选择标签 c++17,则插入标签 c++1z ...奇怪。
  • 因为它是synonym

标签: c++ c++17 if-constexpr


【解决方案1】:

if constexpr 仅适用于模板。来自 [stmt.if]:

如果if 语句的形式为if constexpr,则条件的值应为bool (5.20) 类型的上下文转换的常量表达式;这种形式称为 constexpr if 语句。如果值 转换后的条件为false,第一个子语句是丢弃的语句,否则第二个子语句(如果存在)是丢弃的语句。 在封闭模板化实体的实例化期间 (第 14 条),如果条件在实例化后不依赖于值,则丢弃的子语句(如果有)不会实例化。

X 中,constexpr if 语句将阻止对其他格式错误的语句进行实例化。这就是这个语言特性的目标。但在模板之外,没有这样的等效收益。

【讨论】:

  • 这是一个小问题,我在同一个地方绊倒了。您总是可以为配置条件放置一个模板参数并添加一个间接并在那里实现一些东西,但我不明白严格的限制。是因为实施困难?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多