Кресты / Говнокод #18361 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 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. Более нормального способа, чем через лямбду с замканием, я не нашёл.

Запостил: gammaker gammaker, (Updated )

Комментарии (0) RSS

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8