簡體   English   中英

將地圖與枚舉類成員一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM