[英]Using map with enum e class members
好的,我有以下課程:
class Shader {
public:
...
private:
GLuint _vertexShader;
GLuint _fragmentShader;
}
是否可以在枚舉(GL_VERTEX_SHADER,GL_FRAGMENT_SHADER)和我在該類中聲明的變量之間創建映射? 之所以這樣,是因為我想歸納為該類創建的方法。
switch ( shaderType )
{
case GL_VERTEX_SHADER:
_vertexShader = glCreateShader( shaderType );
glShaderSource( _vertexShader, 1, &shaderCode, 0 );
glCompileShader( _vertexShader );
glGetShaderiv( _vertexShader, GL_COMPILE_STATUS, &isCompiled );
break;
case GL_FRAGMENT_SHADER:
_fragmentShader = glCreateShader( shaderType );
glShaderSource( _fragmentShader, 1, &shaderCode, 0 );
glCompileShader( _fragmentShader );
glGetShaderiv( _fragmentShader, GL_COMPILE_STATUS, &isCompiled );
break;
}
從該代碼中可以看到,我必須做一個開關以執行基本相同的代碼,但只需要更改變量即可。 因此,如果我能代替使用switch,將GLenum與相應的變量映射起來,那就更好了。
直接答案:您可以從枚舉到指向數據成員的指針進行映射:
std::map<GLenum, GLuint Shader::*> mapper;
mapper[GL_VERTEX_SHADER ] = &Shader::_vertexShader;
mapper[GL_FRAGMENT_SHADER] = &Shader::_fragmentShader;
或者,如果枚舉ID的值為0和1:
std::vector<GLuint Shader::*> mapper(2);
mapper[GL_VERTEX_SHADER ] = &Shader::_vertexShader;
mapper[GL_FRAGMENT_SHADER] = &Shader::_fragmentShader;
然后,您只需通過類型為GLuint&的參數化來排除通用代碼。
template <typename SC, typename Bool>
void CreateShader(GLuint& shader, GLenum shaderType, SC& shaderCode, Bool& isCompiled)
{
shader = glCreateShader( shaderType );
glShaderSource( shader, 1, &shaderCode, 0 );
glCompileShader( shader );
glGetShaderiv( shader, GL_COMPILE_STATUS, &isCompiled );
}
接着:
CreateShader(this->*mapper[shaderType], shaderType, shaderCode, isCompiled);
但是對於此示例,我將僅使用開關,而不定義,初始化和使用(global?)映射器對象:
switch ( shaderType )
{
case GL_VERTEX_SHADER:
CreateShader(_vertexShader, shaderType, shaderCode, isCompiled);
break;
case GL_FRAGMENT_SHADER:
CreateShader(_fragmentShader, shaderType, shaderCode, isCompiled);
break;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.