簡體   English   中英

C++ 是否可以保證模板生成的文字條件將被優化掉?

[英]C++ Is there any guarantee that literals conditions generated by a template will be optimized away?

請原諒我的代碼中的任何錯誤,我仍在學習 C++ 語法。 我的問題不是代碼是否正確,而是文字表達式是否會被優化掉。

假設我有一個從非類型模板生成的 function,如下所示:

template <bool add>
int addIt(int a, int b) {
   if (add) {
       return a + b;
   } else {
       return a - b;
   }
}

int v = addIt<true>(10, 5);

據我了解,編譯器應該將模板擴展為:

int addIt_someID(int a, int b) {
   if (true) {
       return a + b;
   } else {
       return a - b;
   }
}

int v = addIt_someID(10, 5);

但是因為它現在說if (true)它應該能夠刪除整個分支,導致:

void addIt_someID(int a, int b) {
       return a + b;
}

int v = addIt_someID(10, 5);

這應該是標准的編譯器行為......但是這種行為是否足夠確定,我可以從所有主要編譯器中確定它?

我依賴於編譯器的這種行為,如果不能保證我將不得不自己實現它......如果可以保證我可以讓 C++ 編譯器來做這將節省我很多時間自己解析和評估這個。

對於常規的if ,這永遠無法保證(盡管我會說機會非常高)。 有兩種方法可以確定。 更簡單的一個需要addIt (順便說一句,似乎返回錯誤的類型):

template <bool add>
int addIt(int a, int b) {
   if constexpr (add) {
       return a + b;
   } else {
       return a - b;
   }
}

int v = addIt<true>(10, 5);

if constexpr保證這將在編譯時進行評估。

另一種選擇是使用模板元編程/顯式模板專業化。 對於您的代碼,這將非常簡單:

template <bool add>
int addIt(int a, int b);

template<> int addIt<true>(int a, int b) { return a + b; }
template<> int addIt<false>(int a, int b) { return a - b; }

int v = addIt<true>(10, 5);

對於其他情況,您需要更多的工作,例如使用std::enable_if和類似的東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM