C++ 函数调用中未使用的参数的模板参数推断

C++ 函数调用中未使用的参数的模板参数推断,c++,templates,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,

因此,我正在围绕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()
}
模板
void着色器::set_Fglm(常量字符串和常量名称、常量T和常量值){
//使用F()做一些事情
}
使用模板参数
。目前,我的cpp文件中有以下代码:

template void Shader::set_Fglm<glm::vec3, gl::Uniform3fv>
(const string& _name, const glm::vec3& _value);
template void着色器::set_Fglm
(常量字符串和名称,常量glm::vec3和值);
然而,目前发生的情况是,我得到了一个编译时错误,即无法推导模板参数F。所以,我想我需要的是一种方式,当我们收到一个类型为glm::vec3的参数时,我们总是希望使用相同的gl函数

如果可能的话,我也不介意,例如,我是否需要调用类似于
aProgram.set\u 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()
}
模板结构DefaultF;
//专业化
模板
结构默认值
{
静态常量表达式void(*Func)(闪烁、GLsizei、常量GLfloat*)=&gl::Uniform2fv;
};
模板
void着色器::set_Fglm(常量字符串和常量名称、常量T和常量值){
//使用F()做一些事情
}


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

您确定
gl::Uniform3fv
具有该签名吗?是。F的所有可能函数都具有相同的签名。此外,float、int和uint函数之间的唯一区别是指针的类型。当我开始工作时,我希望使用同样的解决方案来制作模板。效果很好,甚至看起来很整洁:D