2013-07-22 74 views
0

我想在編譯時使用模板非類型參數來自動分支代碼。即例如:模板非類型參數:編譯時檢查條件

template<std::size_t TDimension> 
class A 
{ 
public: 
    A() 
    {} 

    ~A() 
    {} 

    void print() 
    { 
     if(TDimension == 3) 
      std::cout << "My dimension is 3" << std::endl; 
     else if(TDimension == 2) 
      std::cout << "My dimension is 2" << std::endl; 
    } 
}; 

上面的代碼在運行時分支代碼。問題是:如何在編譯時啓用它以提高性能?

+2

你已經測量這個代碼的性能?沒有?那麼如何在改變它時改進性能?沒有需要改進的地方你就無法改進。 (別擔心,編譯器已經爲你做了優化。) –

+0

恆定表達式和死區消除是真正低懸優化的果實。有理由想要一個真正的編譯時分支,但通常會涉及「如果參數錯誤,其他分支甚至不會編譯」。 – Yakk

回答

3

由於兩個TDimension和你比較,它的值是恆定的,編譯器只生成if沒有運行時比較的一個分支,只要你能優化。

可以肯定的,你可以明確地專門來代替:

template<std::size_t TDimension> 
class A 
{ 
public: 
    void print() {} 
    // or void print(); to give an error for an handled value 
}; 

template <> void A<3>::print() {std::cout << "My dimension is 3" << std::endl;} 
template <> void A<2>::print() {std::cout << "My dimension is 2" << std::endl;} 
+0

你的代碼並沒有給出一個愚蠢的程序員告訴它該死的東西 - 它總是在第三維;) – nijansen

+0

完美。這就是我要找的。 – kstn