Я нахожу двойная скобка , версия test
делает тесты логики записи более естественными:
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
Дело в том, что Boost.MPL, как и Boost.Preprocessor, действительно являются строительными блоками.
В большинстве случаев вы, вероятно, используете его через другие библиотеки, так как ряд библиотек Boost построен на этих двух.
Например:
Вы можете использовать его уже неизвестно:)
Чтобы добавить ответ Матье, он также довольно широко используется в Boost.Python и Luabind .
Если ваше приложение имеет сложную логику в работе с парами ключ-значение, вам потребуется сверхэффективный способ получения значения из ключа, типичная хэш-карта работает хорошо, но если возможные ключи известны заранее, оптимизация может быть выполнена с использованием 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;