![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
InvalidProperty, при помощи синтаксиса С++ данную проблему изящно не решить. ковыряясь только в конструкторах это невозможно.
Однако возник вопрос: что делает конструктор базового класса с переменным числом параметров, тип которых не проверяется в процессе компиляции? вероятно скармливает тому же vsnprintf. Тогда следующий вопрос - зачем классу исключений вообще этим заниматься? пусть конструирует строку тот, кто генерирует исключение, а класс исключения работает с постоянным числом параметров. Всё, проблемы нет. Обратите внимание: ваш pack() - совершенно инородный элемент в классе, класс нагружен не свойственным ему функционалом. Разделите функционал и проблема исчезнет. |
|||
|
||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
вот самый простой вариант. чем не устраивает?
|
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
в бусте кстати есть всякие форматтеры, которые позволяют конструировать на лету строки, имеющие сложный формат. это я к тому, что проблема форматирования строк не нова и давно решена, а класс исключения видимо будет ругаться в окошках. чем? правильно, строками.
предваряя возможную дискуссию о разном числе неких разнотипных свойств, которые надо обрабатывать классу исключения, предложу в этом случае воспользоваться std::vector <boost::variant> или std::vector <boost::any>. Добавлено через 3 минуты и 7 секунд |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
это верно. но наверняка не только мне и InvalidProperty хотелось бы получить такую возможность. и желательно не только строковое сообщение. было бы супер! пример:
в примере я привел только передачу двух значений в конструктор, так как было бы не плохо чтоб остальные свойства заполнялись сами. типа макросами. или еще как-то. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
baldina, по моему раньше этого не было. во всяком случае я этого не заметил.
еще думаю для этого подойдет boost.format -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
andrew_121, кажется то, что выше, вы не читаете
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
этим - -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
как-же мы любим придумывать несуществующие проблемы и решать их
я, в свою очередь, хочу предложить такой способ решения проблемы передачи переменного числа параметров в конструктор базового класса file: generate_ctor.ipp
other file:
тогда тебе как-то придется генерировать класс с переменным числом членов и недетерминированым набором методов |
||||||
|
|||||||
| Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
я не вижу смысла в этом, класс исключения - Copy Constructable, поэтому можно писать так:
Это сообщение отредактировал(а) Lazin - 29.1.2010, 21:59 |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
тогда Вы неправильно поняли мое непонимание. Меня интересовала именно задача, а не неполучающийся способ ее реализовать. Ну вообщем тут уже много ответили, но еще раз проакцентирую внимание:
|
||||
|
|||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
меня навели на мысль еще одного варианта решения, который, как мне кажется, является более изящным, чем первый:
-------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
этот вариант ни разу не изящный, обычный std::exception + boost.format - намного удобней, а главное обходятся без элипсиса
|
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
Lazin, удобство понятие относительное и сугубо индивидуальное. Не нужно излишних холиваров. Я, к примеру, недолюбливаю сторонние библиотеки, а строка форматирования printf для меня выглядит привычнее и удобнее.
Это сообщение отредактировал(а) InvalidProperty - 30.1.2010, 19:22 -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
я лично не понимаю, зачем все это, если можно просто отформатировать строку и передать ее в конструктор класса исключения, еще я не понимаю, почему не используется std::exception, а используется свой велосипед ну и на последок, если я захочу получить тот или иной параметр не в текстовом виде, что мне делать?
лично я бы не хотел работать в одной команде с вело-строителем любителем, потому-что вместо того, что-бы просто писать код, придется изучать аналоги уже хорошо известных вещей, вроде boost::format и std::exception вот к примеру вариант с boost::exception (не ручаюсь за правильность, пишу по памяти)
по крайней мере это будет понятно любому нормальному С++ программисту, а еще здесь можно получить любой из параметров или добавить туда новые параметры и заново бросить это исключение, можно передать его в другой поток Это сообщение отредактировал(а) Lazin - 30.1.2010, 20:01 |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |