спасибо, кэп, я в курсе, специально для тебя туда и вставил комментарий :) просто у меня на std::map чаще всего взгляд как на оптимизацию, которая зачастую просто не нужна.
А оно чаще всего так и есть - из-за нелокальности доступа к памяти. Чтобы std::map был выгоднее вектора, в нём должны быть сотни, если не тысячи элементов.
а я вот как-то поотлаживал код с нежелательными неявными преобразованиями типов (они могут составлять сколь угодно длинные цепочки) и теперь всегда пишу explicit для конструкторов с одним параметром, или конструкторов, которые могут быть с одним параметром (например, за счёт значений по умолчанию)
Это и правда нетривиальная вещь, ведь компилятор генерирует целых три деструктора - scalar deleting destructor, vector deleting destructor и обычный деструктор, и вызывает разные в зависимости от контекста.
но это он могет молодой писал, пока не был еще великим учителем и гуру.
на меня самого компромата насобирать можно -- будь здоров. как садишься суппортить свой код N летней давности (особенно, не дай б-г на Delphi!) сам себя громко ненавидишь :)
да. Однако специализации ICodeGenerator в вашем случае - синглтоны. Зачем их создавать по запросу. Проще в конструкторе конкретного генератора регистрироваться в каком-то одном, хорошо известном, менеджере. И enum нафиг нужен, лучше, когда ключем является имя языка.
Comments 42
Reply
просто у меня на std::map чаще всего взгляд как на оптимизацию, которая зачастую просто не нужна.
Reply
Reply
Отсутствие кл.сл. explicit в декларации конструктора с одним параметром (в коде в статье на хабре) как нельзя лучше подтверждает эту точку зрения.
Reply
плюс кое где потерял const, плюс кое-где потерял boost::noncopyable
Reply
Reply
по стандарту -- можно сделать только одно такое преобразование за раз.
Reply
Это и правда нетривиальная вещь, ведь компилятор генерирует целых три деструктора - scalar deleting destructor, vector deleting destructor и обычный деструктор, и вызывает разные в зависимости от контекста.
Однако ж работает, зараза.
Reply
Copy Source | Copy HTML
Reply
но это он могет молодой писал, пока не был еще великим учителем и гуру.
на меня самого компромата насобирать можно -- будь здоров. как садишься суппортить свой код N летней давности (особенно, не дай б-г на Delphi!) сам себя громко ненавидишь :)
Reply
Reply
И enum нафиг нужен, лучше, когда ключем является имя языка.
Reply
из задачи не понятно, имеет ли реализация этого класса состояние или нет.
> И enum нафиг нужен
я писал о том, что ключ можно использовать любого типа.
Reply
Тут
class CodeGenerator
{
public:
enum Lang {JAVA, C_PLUS_PLUS, PHP};
CodeGenerator(Lang language) { _language=language; }
std::string generateCode()
{
switch(_language) {
case JAVA: //return generated java code
case C_PLUS_PLUS: //return generated C++ code
case PHP: //return generated PHP code
}
throw new std::logic_error("Bad language");
}
std::string someCodeRelatedThing() // used in generateCode()
{
switch(_language) {
case JAVA: //return generated java-related stuff
case C_PLUS_PLUS: //return generated C++-related stuff
case PHP: //return generated PHP-related stuff
}
throw new std::logic_error("Bad language");
}
private:
Lang _language;
}
состояний не вижу.
Хотя конечно, выдавать по генератору на запрос - более гибкий подход.
Reply
Leave a comment