Как стать автором
Обновить

Комментарии 20

И из за опечатки логи ошибок на 16кб…
ага, идеальным решением на все случаи жизни я бы это не назвал
Буст хорош тем, что авторам языков программирования нужно туда смотреть и делать все это на языковом уровне. Прямо по списку. Каждая библиотека — фича языка (ну кроме традиционно библиотечных вещей типа ввода-вывода конечно же). А непосредственно такими вот макросами ИМХО лучше не пользоваться:)
Рискну навлечь на себя праведный гнев, ввязавшись в холивар…
Но по-моему (повторяю и подчеркиваю — это мое мнение! — оно не обязано совпадать с вашим):
«совершенный код» — это тот код, который (1)короче и в котором (2)меньше шансов ошибиться
Да, приведенный пример решает второй пункт, но никак не коррелирует с моим первым критерием.
Если у ваших функций 5 параметров, где вперемешку int и int& причем несколько из них заданы по умолчанию — проблема в вашей голове, а не в C++ и boost c подобного рода костылем эту проблему не решит.
В статье хотелось бы увидеть пример кода, который генерируется в результате разворачивания этого макроса. Особенно интересно то, во что превращается код вызова с именованными аргументами.

Касательно самого подхода, имхо, проблема надумана. Нормальная среда разработки подскажет и порядок, и значения по умолчанию для любой функции. А как подсказка будет работать для сгенерированного из макроса кода — не представляю.
>>Нормальная среда разработки подскажет и порядок, и значения по умолчанию

Что если разработчик функции решит поменять значение по умолчанию?

Ответ «Оторвать разработчику руки» не предлагать плз
Идеального решения нет, согласен. Наименее стрёмный из того, что мне пришло в голову — это использовать для дефолтных значений аргументов статические поля какого-нибудь специального класса, или на худой конец именованные константы.
Или структуры передавать, хотя в плюсах нельзя как в С99 инициализировать поля по именам.
Не совсем по теме, но я не понимаю, почему это убрали из C++? По сути, основное обратно несовместимое изменение, причём совершенно не понятно, кому оно помешало.
Его не убирали. С++ основывался на С89 и просто не включил в себя эту фичу.
Идеальным решением было бы позволить пропускать дефолтные параметры. Но комитет почему-то так не считает.

foo (10, default, default, 20);

Т.е. то же самое, что я предложил ниже, но работает с любыми типами.
Ключевое слово default уже все равно есть, техническая реализация — елементарная.
> В статье хотелось бы увидеть пример кода, который генерируется в результате разворачивания этого макроса.

Увы, пример кода, который генерируется в результате разворачивания этого макроса, в статью не поместится :).

А так пожалуйста, функция с тремя параметрами: pastebin.com/3ntTUfFr

Проблему с дефолтными параметрами частично можно решить так. Частично, потому как работает только с интегральными типами

ideone.com/mT7z0z

(даю ссылку т.к. тэг source не работает)
Упаси боже использовать эти костыли в продашкене.
Эти костыли не просто так появились. Boost.Graph широко использует их. Сходу нагуглил: тут вроде обосновывают.
Мне кажется, что под Boost.Graph их и разрабатывали. Не знаю, как объявлять такие функции, а использовать вполне удобно.
Лучше бы они сделали Linq-style (aka call chains).
По производительности за счет инлайна было бы тоже самое, плюс намного читабельнее.
Относительно простое решение есть через множество методов c return *this:
some_object.width( 10 ).height( 15 ).hidden( true );
А функции с более чем 2-3 параметрами вообще не стоит создавать имхо, тогда и боротся с ними не придется.
в целях изучения возможностей С++ — интересно, а вот на практике такое использовать… чего стоит только определение функции, в которое нужно вчитываться даже для того, чтобы понять сколько же там все таки параметров, какое у функции имя и что она возвращает.

ИМХО, чего только люди не придумают, лишь бы не слазить с С++.
Этот уникальный язык предоставляет настолько богатые возможности, что взяв двух профессионалов С++ нет никакой гарантии, что они поймут код друг друга без нескольких часов предварительного анализа используемых подходов. А так да, если разобраться то «все просто».

p.s. Сам ушел несколько лет назад с С++ в C# и с тех пор с содроганием вспоминаю ощущение, когда вместо того, чтобы решать реальную задачу борешься с языком.

* вышенаписанное является моим личным мнением и не претендует на абсолютную истинность
В одном вы правы, за использование именовынных параметров boost на практике я бы лично сильно бил по рукам. Уродливо и нечитаемо

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории