2016-12-01 91 views
0

我對這個模板[示例一]的擴展感到困惑。如果在運行時檢查b存儲的構造函數中的bool b是否存在?它被放入私人數據部分[示例二]?或者它成爲編譯時間,並刪除基於bool的分支?或者它簡單地 「粘貼」 什麼被用作模板參數傳遞到如果(B)[實施例3]如何擴展模板參數

實施例之一:

template<bool b> 
    class Test 
    { 
    public: 
     Test() 
     { 
      if(b) 
      { 
       // do something 
      } 
      else 
      { 
       // do something else 
      } 
     } 
    }; 

實施例二:

class Test 
{ 
public: 
    Test() 
    { 
     if(b) 
     { 
      // do something 
     } 
     else 
     { 
      // do something else 
     } 
    } 

private: 
    bool b = true; 
}; 

實施例3 :

//called with Test<true> 

class Test 
{ 
public: 
    Test() 
    { 
     if(true) 
     { 
      // do something 
     } 
     else 
     { 
      // do something else - probably removed due too compiler optimization 
     } 
    } 
}; 

回答

2

示例3是更接近編譯器所做的代碼片段。理解示例2錯誤是很重要的,因爲模板參數是在編譯時計算的,而不是作爲字段注入到類中。

if(b){ } else { }其中b是一個模板bool參數將需要if語句的兩個分支既解析的合式,即使編譯器將很可能優化了不匹配的分支b


如果你想保證編譯時的分支評估,如果你只需要採取分支是合式,你可以在C++ 17使用if constexpr(...)

if constexpr(b) 
{ 
    // do something 
} 
else 
{ 
    // do something else 
} 

...或者在C++中實現自己的static_if結構14 ...

...或在C++ 11中使用explicit template specialization

我在CppCon 2016的演講中涵蓋了所有這些技巧,"Implementing static control flow in C++14"

0

是它放進私人數據部分[考試兩個]?

那麼,沒有。你可以這樣想,因爲基本上b只能在Test中訪問,但它實際上並不是一個私有成員,它是一個模板參數。

它成爲編譯時間,並刪除基於bool的分支?

一個好的編譯器可能會優化分支,是的,因爲在編譯時分支的結果是已知的。但你不能確定。