2017-04-19 70 views
2

我想在下面的代码中使用constexpr布尔(useF)在下面的代码中启用一个功能。在这里,拨打A::f()。另外,在我关闭该功能的情况下,我希望将别名模板(a)设为void如果constexpr(条件)作为编译时条件

我试着用constexpr if语句,但是body仍然在被实例化,这会导致编译错误。如果我使用包装模板(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(); 
} 

我使用克++ - 7.0.1与-std = C++ 17

+0

对不起,标签选择错了!如果我选择标签C++ 17,插入标签C++ 1z ...奇怪。 – wimalopaan

+1

因为它是[同义词](http://stackoverflow.com/tags/c%2b%2b1z/synonyms)。 – songyuanyao

回答

2
if constexpr

仅用于模板。从[stmt.if]:

如果if语句是形式if constexpr的,条件的值应为bool类型(5.20)的上下文转换常量表达式;这种形式被称为constexpr if声明。如果 的值的转换条件是false,则第一个子语句是丢弃语句,否则第二个子语句(如果存在)是放弃语句。 在封装模板实体 (第14章)的瞬时过程中,如果条件在其实例化之后不是依赖于值的,则被丢弃的子条目(如果有的话)未实例化。

X之内,constexpr if语句将防止其他格式不正确的语句被实例化。这是此语言功能的目标。但在模板之外,没有这样的等价收益。

+0

这是一个可怜的,我偶然发现在同一个地方。你总是可以为一个配置条件添加一个模板参数,并添加一个间接方法并在那里实现,但我不明白这个严格的限制。这是因为执行困难? –