2014-04-02 38 views
0

我是一個完整的小白來元編程和我的問題非常簡單,但我還沒有發現類似的簡單answer.Something的回答here但我不能把它翻譯給我需要。插入方法的身體條件使用C++模板

我有這樣

class Program { 

public: 

    Program(){} 

    SetMatrixUniform(){ 

     CallSomeMethodX(); 

    } 

    ~Program(){} 

}; 

一類,但我有我需要用同樣的方法在同一類,但呼籲他們bodies.Something不同的功能類似這樣的場景:

class Program { 

public: 

    Program(){} 

    SetMatrixUniform(){ 

     CallSomeMethodY(); 

    } 

    ~Program(){} 

}; 

我想有模板接口與「真」參數這樣的類選擇要執行的投入在編譯時類成員方法,而不是保持2這樣的類。

是這樣的:

Program<true> myProg; ///expands CallSomeMethodX(); into SetMatrixUniform() 

同時:

Program<false> myProg; ///expands CallSomeMethodY(); into SetMatrixUniform() 

我所看到的例子,其中類變化的聲明,然後通過專業化的最後類擴展those.I的人會喜歡做的事它沒有使用繼承,因爲這裏的性能非常重要。

+1

您可能對[此博客條目]感興趣(http://dev-jungle.blogspot.de/2014_02_01_archive.html)。這就是我通常用來解決這類問題的方法。同樣適用於例如選擇提供行爲實現的特定基類。 –

回答

2

這可以通過使用模板特

來解決我們首先聲明Programm爲取一個布爾參數模板:

template<bool B> 
struct Programm 
{ 
    struct SetMatrixUniform() 
    { 
     std::cout << "General/Generic Implementation" << std::endl; 
    } 
}; 

現在,我們可以進行更具體的案例提供了另一種實現方式/專業化,例如,如果B == true

template<> 
struct Programm<true> 
{ 
    void SetMatrixUniform() 
    { 
     std::cout << "Sepcific Implementation For B == true" << std::endl; 
    } 
}; 

由於bool只能容納兩個狀態:真與假,如果模板與假,第二個實例,如果模板與真實instantied第一個實現將被使用。


該解決方案然而是那種冗長,需要你們倆重新實現了你很多的功能。如果你只需要在短短的一些方法不同的行爲,你也可以直接比較B。例如:

template<bool B> 
struct Programm 
{ 
    void SetMatrixUniform() 
    { 
     if(B == true) 
      //... 
     else 
      //... 
    } 
}; 
+0

所以,如果程序類具有類似功能的40這意味着我需要有40你的第一個40你的第二個結構?它不能在方法級別解決嗎? –

+0

@MichaelIV我已經在這上面了^^ – Paranaix

+0

所以你的第二個例子會有效地生成只有一個方法並刪除條件分支? –