Я хочу создавать новые экземпляры программ в зависимости от расширения файла. К сожалению, я не могу изменить интерфейс, потому что filename является аргументом командной строки. Кроме того, мне не нравится, что если я хочу добавить новую программу, мне приходится иметь дело с операторами if-else. Я думал о картах для хранения (string, type_index), но, видимо, этот подход не работает с шаблонами. Кроме того, я попытался разобраться с std :: enable_if, передав функцию сравнения строк constexpr, но это, очевидно, тоже не работает. Я полагаю, что могу как-то расширить последний подход, создав набор функций и выбрав одну в зависимости от сравнения строк. По сути, я хочу добиться расширяемости и соответствовать принципам SOLID.
std::shared_ptr<Program> Program::fromFile(const Path& file){
auto extension = file.extension();
if(extension == "cpp"){
return std::make_shared<CppProgram>(file);
} else if(extension == "py"){
return std::make_shared<PythonProgram>(file);
} else if(extension == "java"){
return std::make_shared<JavaProgram>(file);
} else if(extension == "go"){
return std::make_shared<GoProgram>(file);
} else {
throw std::runtime_error("unknown file extension " + extension);
}
}