Примеры практического использования Boost :: MPL?

Я нахожу двойная скобка , версия test делает тесты логики записи более естественными:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

27
задан Null 18 April 2016 в 18:18
поделиться

3 ответа

Дело в том, что Boost.MPL, как и Boost.Preprocessor, действительно являются строительными блоками.

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

Например:

  • Boost.Fusion (который пересекает промежутки между областями времени компиляции и выполнения)
  • Boost.MultiIndex (для более легкого интерфейса)
  • Boost.Unit (для пространственного анализа)
  • Boost. Вариант, я думаю, также зависит от него

Вы можете использовать его уже неизвестно:)

14
ответ дан 28 November 2019 в 05:19
поделиться

Чтобы добавить ответ Матье, он также довольно широко используется в Boost.Python и Luabind .

3
ответ дан 28 November 2019 в 05:19
поделиться

Если ваше приложение имеет сложную логику в работе с парами ключ-значение, вам потребуется сверхэффективный способ получения значения из ключа, типичная хэш-карта работает хорошо, но если возможные ключи известны заранее, оптимизация может быть выполнена с использованием boost: : mpl, с массивом и методом для преобразования вашего ключа в индекс массива во время компиляции, это, безусловно, более эффективно.

Вот пример обработки сообщения об исправлении , которое представляет собой сообщение, содержащее различные пары ключ-значение, которое активно используется в приложениях для финансовой торговли:

#include <iostream>
#include <array>
#include <string>
#include <unordered_set>
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/find.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/integral_c.hpp>
#include <boost/mpl/size.hpp>

using namespace std;
using namespace boost;


struct TagEntity
{
    bool isValid;
    std::string value;
};

template<class CommonTags>
struct FixMsg
{
    static constexpr uint32_t CommonTagsCount = mpl::size<CommonTags>::type::value;

    template<int Tag>
    constexpr uint32_t index()
    {
        constexpr auto idx = mpl::find<CommonTags, mpl::integral_c<int, Tag>>::type::pos::value;  // this is the key step: convert tag to index in compile time
        static_assert(idx < CommonTagsCount, "tag not found");
        return idx;
    }
    template<int Tag>
    TagEntity& getTagEntity()
    {
        return _commonTags[index<Tag>()];
    }

    std::array<TagEntity, CommonTagsCount> _commonTags; // or else use std::unordered_set, which is not as fast as this approach: absolute O(1) in runtime
};


int main(int argc, char** argv)
{
    using MyCommonTags = mpl::vector_c<int,
          11,
          35,
          10914,
          10916>;

    FixMsg<MyCommonTags> fixMsg;
    auto& tagEntity = fixMsg.getTagEntity<11>();
    tagEntity.isValid = true;
    tagEntity.value = "Get tag entity in O(1)";

    cout << tagEntity.value << endl;

2
ответ дан 28 November 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: