我有一个存储特定变量的类,我使用模板来指定类型。这很重要,因为OpenGL具有不同的功能来更新着色器中的这些值。这是标题shader_variable.h
。
template<typename T, typename = std::enable_if<std::is_pointer<T>::value == false>>
class ShaderVariable : public Base::ShaderVariable
{
public:
ShaderVariable(const std::string& a_Name, ShaderProgram& a_Program) :
Base::ShaderVariable(a_Name, (Liane::Base::ShaderProgram&)a_Program, (void*)&m_Value),
m_Name(a_Name)
{
}
operator const T&() const { return m_Value; }
const T& GetValue() const { return m_Value; }
void Update() override;
private:
std::string m_Name;
T m_Value;
};
在CPP文件中,我有以下定义
template<> void ShaderVariable<glm::vec3>::Update()
{
std::cout << "Updating vec3" << std::endl;
glUniform3fv(m_Reference, 1, glm::value_ptr(m_Value));
}
template<> void ShaderVariable<glm::vec4>::Update()
{
std::cout << "Updating vec4" << std::endl;
glUniform4fv(m_Reference, 1, glm::value_ptr(m_Value));
}
template<> void ShaderVariable<glm::mat3>::Update()
{
std::cout << "Updating mat3" << std::endl;
glUniformMatrix3fv(m_Reference, 1, GL_FALSE, glm::value_ptr(m_Value));
}
template<> void ShaderVariable<glm::mat4>::Update()
{
std::cout << "Updating mat4" << std::endl;
glUniformMatrix4fv(m_Reference, 1, GL_FALSE, glm::value_ptr(m_Value));
}
在main函数中,我首先创建一个glm::mat4
ShaderVariable,然后是glm::vec3
秒。如果我这样做,一切都编译好,所有ShaderVariables都调用glm :: mat4 Update()。
现在,通常我将模板定义放在头文件中,但由于复杂性,我更喜欢cpp文件。有没有办法缓解这个问题?
我还补充道
template class ShaderVariable<glm::vec3>;
template class ShaderVariable<glm::vec4>;
template class ShaderVariable<glm::mat3>;
最后,正如另一个问题的答案所暗示的那样,但这对我的问题毫无帮助。