Является ли повышение :: вариант ракетостроения?(И я должен поэтому избегать этого для простых проблем?) - PullRequest
4 голосов
/ 25 ноября 2010

ОК, поэтому у меня есть маленький кусочек моего кода, где я бы хотел, чтобы моя функция возвращала любое из значений (int, double, CString), чтобы немного очистить код.

Итак, я думаю: нет проблем, чтобы написать небольшую обертку в виде объединения struct с тремя членами и т. Д. Но подождите! Разве я не читал о boost::variant? Разве это не то, что мне нужно? Это избавило бы меня от необходимости возиться со структурой оболочки! (Обратите внимание, что у меня уже есть библиотека повышения, доступная в моем проекте.)

Итак, я запускаю свой браузер, перехожу к Глава 28. Boost.Variant и о чудо:

Шаблон варианта класса представляет собой безопасный, общий, основанный на стеке контейнер различаемого объединения, предлагающий простое решение для манипулирования объектом из разнородного набора типов [...]

Отлично! Именно то, что мне нужно!

Но тогда это продолжается:

Boost.Variant vs. Boost.Any

  • Boost.Any мало использует методы метапрограммирования шаблонов (избегая потенциально трудно читаемых сообщений об ошибках и значительных требований процессора и памяти во время компиляции).

[...]

Поиск и устранение неисправностей

«Достигнут внутренний предел кучи» - Microsoft Visual C ++ - Параметр компилятора / ZmNNN может увеличить предел выделения памяти. NNN представляет собой процент масштабирования (то есть 100 обозначает предел по умолчанию). (Попробуйте /Zm200.)

[...]

Э-э-э. Так что использование boost :: variable может значительно увеличить время компиляции и генерировать трудно читаемые сообщения об ошибках. Что, если кто-то переместит мое использование boost :: variable в общий заголовок, внезапно компиляция нашего проекта займет намного больше времени? Я ввожу (излишне) сложный тип?

Должен ли я использовать boost::variant для моей простой крошечной проблемы?

Ответы [ 4 ]

7 голосов
/ 25 ноября 2010

Как правило, используйте boost::variant, если вы хотите хотите различить объединение (any для неизвестных типов - воспринимайте это как своего рода эквивалент того, как void* используется в C) .

Некоторые преимущества включают обработку исключений, потенциальное использование меньшего пространства, чем сумма размеров типов, различение типа «посещение». В основном, вещи, которые вы хотели бы исполнить на дискриминированном союзе.

Однако, чтобы boost::variant был эффективным, по крайней мере, один из используемых типов должен быть "легко" сконструирован (более подробную информацию о том, что означает "легко") читайте в документации.

5 голосов
/ 25 ноября 2010

Boost.variant не такой сложный, ИМХО.Да, он основан на шаблонах, но он не использует никаких действительно сложных функций C ++.Я использовал совсем немного и никаких проблем.Я думаю, в вашем случае это помогло бы лучше описать, что делает ваш код.

Другой способ мышления - преобразовать то, что эта функция возвращает, в более семантически богатую структуру / класс, который позволяет интерпретировать, какой внутренний элемент интересен, ноэто зависит от вашего дизайна.

1 голос
/ 25 ноября 2010

Этот тип элемента усиления происходит от функционального программирования, где у вас есть вариантов за каждым углом.

Это должен быть способ обеспечения безопасного типа для возврата видазначение, которое может иметь много точных типов.Это означает, что это полезно для решения вашей проблемы, НО вы должны подумать, действительно ли это то, что вам нужно сделать.

Дополнительной ценностью по сравнению с другими подходами, которые пытаются решить ту же проблему, должна быть безопасность типов (выне сможет разместить все, что вы хотите внутри варианта, не заметив, в противоположность void*)

0 голосов
/ 25 ноября 2010

Я не использую его, потому что для меня это признак плохого дизайна.

Либо ваш метод должен вернуть объект, который реализует определенный интерфейс, либо он должен быть разбит на несколько методов.В любом случае, дизайн должен быть пересмотрен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...