C++: ВЫ используете Loki или Boost для функторов?

Я читал книгу Александреску «Современный дизайн C++» и был очень впечатлен методами, которые он использует, поэтому я хотел добавить библиотека Loki для моего приложения.

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

Меня больше всего интересовало использование loki из-за дизайна, основанного на политике, и функторов.

Для меня и буст, и локи имеют как плюсы, так и минусы. Основная проблема, с которой я столкнулся с loki, — это плохая документация (библиотека больше не привязана к книге), но мне кажется, что loki более мощный и гибкий в некоторых областях, чем boost (в этом я могу ошибаться).

Прежде чем использовать boost или loki для функторов и политик, я хотел бы узнать мнение людей, которые используют их в реальной жизни.

Иногда вещи выглядят очень хорошо на бумаге, но имеют некоторые недостатки, когда вы используете их в реальности :)


person Dinaiz    schedule 26.06.2010    source источник
comment
Отсутствие синглтона — одна из лучших особенностей Boost. Последнее, что нужно миру, — это поощрение использования большего количества синглетонов.   -  person jalf    schedule 27.06.2010


Ответы (4)


Я использую Boost во всей своей среде C++ как расширение стандартной библиотеки (с VC9 и VC10).

Я не использую его во всех проектах.

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

Я использую boost::function в большом игровом проекте (с несколькими другими библиотеками от boost).

Локи тоже хорош, но я не чувствовал необходимости. Я думаю, что единственной частью библиотеки, которую я думаю использовать, является Singleton, но я использую пользовательскую, которая на данный момент достаточно хороша.

person Klaim    schedule 26.06.2010

У Александреску были очень интересные идеи (списки типов, шаблоны классов на основе политик и т. д.), но многие из них были улучшены в ускорении, а также протестированы на более широком диапазоне компиляторов на переносимость и корректность.

Я бы рекомендовал предпочесть boost, когда это возможно, только по этим причинам. Тем не менее, Modern C++ Design по-прежнему дает много информации о гибкости C++ и позволяет заглянуть в мысли одного человека (очень хорошего), чтобы решить множество общих проблем программирования.

Например, интеллектуальные указатели на основе политик — очень хорошая идея, но мы можем понять, почему авторы boost решили не реализовывать shared_ptr и scoped_ptr таким образом:

A. Параметризация отпугивает пользователей. Шаблон shared_ptr тщательно разработан для удовлетворения общих потребностей без обширной параметризации. Когда-нибудь может быть изобретен настраиваемый интеллектуальный указатель, который также очень прост в использовании и очень трудно использовать неправильно. До тех пор, shared_ptr является предпочтительным интеллектуальным указателем для широкого круга приложений. (Тем, кто интересуется интеллектуальными указателями на основе политик, следует прочитать книгу «Современный дизайн C++» Андрея Александреску.)

Если вам действительно нужен широкий спектр интеллектуальных указателей, и вы и ваша команда комфортно работаете с параметризацией шаблонов, то вам может подойти подход к реализации интеллектуальных указателей на основе политик. Тем не менее, scoped_ptr и shared_ptr (наряду со weak_ptr), как правило, справляются со своей задачей довольно тщательно. Комбинаторное поведение классов политик, вероятно, лучше использовать для чего-то, для чего существует множество полезных комбинаций.

Тем не менее, есть еще несколько интересных предложений от Александреску, на которые Boost не обратил внимание. MOJO, например, все еще действительно полезен до тех пор, пока компиляторы не станут лучше реализовывать конструкторы перемещения или пока мы можно использовать ссылки rvalue из C++0x. У него также есть очень интересные мысли о реализации распределителей памяти.

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

person stinky472    schedule 27.06.2010

Одна вещь, которую следует учитывать, заключается в том, что библиотеки повышения должны пройти процесс рецензирования во время принятия. После этого, конечно, я считаю, что действительно очень мало надзора за тем, какие изменения вносятся, но, по крайней мере, есть некоторая проверка, прежде чем они будут приняты. Локи — всего лишь видение одного человека. Александреску, конечно, неплохой, но все же... это все его идеи, и никакого дальнейшего обзора нет.

person Edward Strange    schedule 27.06.2010

C++0x — это то, что я использую для объектов быстрых функций.

person Puppy    schedule 26.06.2010
comment
пожалуйста, поправьте меня, если я ошибаюсь, но С++ 0x не полностью поддерживается ни gcc, ни Visual Studio 2008, или это так? - person Dinaiz; 27.06.2010
comment
@Dinaiz: Вы можете получить последнюю версию GCC, в которой МНОГО С++ 0x, включая лямбда-выражения, я думаю. В VS2008 их нет, но вы не указали компиляторы в своем вопросе. - person Puppy; 27.06.2010
comment
Да, это правда, я не ожидал ответа, связанного с чем-то, что зависит от компилятора :) - person Dinaiz; 27.06.2010
comment
@DeadMG: у VS2008 нет. Вы ошибаетесь, vs2008 поддерживает TR1, что означает массив, регулярное выражение, unordered_set/map, tuple, shared_ptr и std::function (вместе с bind и mem_fn) - person Thomas Petit; 27.06.2010
comment
@Thomas Petit: это TR1, а не C++0x. - person Puppy; 27.06.2010
comment
Да, однако, большая часть TR1 является частью C++0x, поэтому TR1 можно рассматривать как подмножество или C++0x. - person Dinaiz; 28.06.2010