函数调用中未使用的参数的模板参数推导

时间:2014-11-06 09:41:02

标签: c++ templates

所以,我正在围绕一个OpenGL着色器程序编辑我的包装器。我正在尝试修改它以使用模板来设置制服的功能,因为它们几乎都是一样的。

我希望的最终结果是电话:

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);

但是,目前发生的是我得到编译时错误,说不能推导出Template参数F.所以,我认为我需要的是一种说法,当我们收到glm :: vec3类型的参数时,我们总是希望使用相同的gl函数。

如果可能,我也不介意,例如,我是否需要调用类似aProgram.set_F3glm的内容。但是如果是这样的话,我怎么还会让实现本身只写一次。之前我只是存储了每个制服的枚举,然后检查它以查看要调用的函数,并且set函数将始终采用c指针。

很抱歉,如果措辞非常糟糕,但我不确定我在做什么。

1 个答案:

答案 0 :(得分: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