2014-11-06 66 views
0

所以,我正在編譯圍繞OpenGL Shader程序的包裝。我試圖修改它以使用功能模板來設置制服,因爲它們幾乎都是一樣的。函數調用中未使用的參數的模板參數推導

我期望的最終結果是使呼叫:

aProgram.set_Fglm("uformName", glm::vec3(0, 1, 2)); 

要調用模板函數:

template<class T, void (*F)(GLint, GLsizei, const GLfloat*)> 
void Shader::set_Fglm(const string& _name, const T& _value) { 
    // do stuff using F() 
} 

與模板參數<glm::vec3, gl::Uniform2fv>。目前,我在我的cpp文件中的代碼:

template void Shader::set_Fglm<glm::vec3, gl::Uniform3fv> 
(const string& _name, const glm::vec3& _value); 

然而,目前什麼情況是,我得到一個編譯時錯誤,說是模板參數F無法被推斷。所以,我認爲我需要的是一種說法,當我們收到一個類型爲glm :: vec3的參數時,我們總是希望使用相同的gl函數。

如果可能,我也不會介意,例如,我需要打電話給aProgram.set_F3glm。但是,如果是這樣的話,我將如何仍然只有一次寫入實現本身。我之前所做的只是將每個制服的枚舉存儲起來,然後檢查它們以查看要調用的函數,並且set函數總是需要一個c指針。

對不起,如果這是措辭相當可怕,但我不知道我在做什麼。

+0

你確定'gl :: Uniform3fv'有那個簽名嗎? – 2014-11-06 09:48:23

+0

是的。 F的所有可能的功能都具有相同的簽名。此外,float,int和uint函數之間的唯一區別是指針的類型。當我得到這個工作時,我希望使用相同的解決方案來模板。 – Jagoly 2014-11-06 09:49:29

回答

2

你可以寫一個性狀的是,像這樣:

template <typename T> struct DefaultF; 

// Specialization 
template <> 
struct DefaultF<glm::vec3> 
{ 
    static constexpr void (*Func)(GLint, GLsizei, const GLfloat*) = &gl::Uniform2fv; 
}; 

template<class T, void (*F)(GLint, GLsizei, const GLfloat*) = DefaultF<T>::Func> 
void Shader::set_Fglm(const string& _name, const T& _value) { 
    // do stuff using F() 
} 

Example

注意,你可能會刪除模板參數F並在功能直接使用DefaultF<T>::Func

+0

工程很棒,甚至看起來很整齊:D – Jagoly 2014-11-06 10:30:45

相關問題