- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
void AttachToParser(Parser* pParser)
{
parser=pParser;
static const char* const typeNames[]={"ShaderInterface", "ShaderModule", "ShaderModuleType", "ShaderModulePattern", "ShaderTemplate"};
typedef void (ShaderGeneratorParser::* StructureProcessor)();
static StructureProcessor processors[]={&ShaderGeneratorParser::ProcessShaderInterface, &ShaderGeneratorParser::ProcessShaderModule,
&ShaderGeneratorParser::ProcessShaderModuleType, &ShaderGeneratorParser::ProcessShaderModulePattern, &ShaderGeneratorParser::ProcessShaderTemplate};
for(uint i=0; i<numof(processors); i++)
{
auto processor=processors[i];
ShaderGeneratorParser mycopy=*this;
parser->DeclarationBlockParsers.Append(typeNames[i], [mycopy, processor]() mutable {(mycopy.*processor)();});
}
}
Делаю парсер конфигов для своего игрового движка. Он готов наверное всего на 10% и представлял собой один класс, который уже разросся. Стало неудобно по нему передвигаться. Решил разбить парсер на модули. Это код того, как один из модулей цепляется к основному классу парсера.
Этот модуль умеет парсить 5 разных блоков, объединённых общим назначением - сборка шейдеров из модулей. За каждый тип блоков отвечает своя функция. Об этом функция и сообщает основному классу.
Цель такая, чтобы модуль работал даже после удаления самого экземпляра. Для этого пришлось пропихнуть копию экземпляра внутрь std::function. Более нормального способа, чем через лямбду с замканием, я не нашёл.
Комментарии (0) RSS
Добавить комментарий