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

Template parameter deduction for parameters not used in function call

本文关键字:参数 函数调用 未使用      更新时间:2023-10-16

因此,我正在围绕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()
}

其中模板参数为CCD_ 1。目前,我在我的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指针。

如果这个措辞很糟糕,我很抱歉,但我真的不确定我在做什么。

你可以为此写一个特征,比如:

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()
}

示例

请注意,您可以删除模板参数F,并在函数中直接使用DefaultF<T>::Func