2017-04-19 25 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

這是一個可憐的,我偶然發現在同一個地方。你總是可以爲一個配置條件添加一個模板參數,並添加一個間接方法並在那裏實現,但我不明白這個嚴格的限制。這是因爲執行困難? –