Boost.flyweight и Boost.MPL - PullRequest
       16

Boost.flyweight и Boost.MPL

5 голосов
/ 20 октября 2011

У меня есть вопрос, касающийся опциональных весов, учитывая приведенное ниже определение на основе http://www.boost.org/doc/libs/1_40_0/libs/flyweight/test/test_basic.cpp

typedef boost::flyweights::flyweight<
    std::string, 
    boost::flyweights::tag<int>,
    boost::flyweights::static_holder_class<boost::mpl::_1>,          
    boost::flyweights::hashed_factory_class<
        boost::mpl::_1, 
        boost::mpl::_2, 
        boost::hash<boost::mpl::_2>,
        std::equal_to<boost::mpl::_2>,
        std::allocator<boost::mpl::_1>
    >,
    boost::flyweights::simple_locking,
    boost::flyweights::refcounted
> StringFlyweight;

StringFlyweight    test1("Hello World");

, какое значение имеет boost::mpl::_1 и boost::mpl::_2?Когда назначены?

boost::mpl::_1 наиболее вероятно std::string.boost::mpl::_2 должно быть size_t?Если правда, как вычитается?Я не понимаю, как выбран key_type.

Я прочитал http://www.boost.org/doc/libs/1_41_0/libs/flyweight/doc/tutorial/lambda_expressions.html, но это мой первый контакт с Boost.MPL, и его недостаточно:)

1 Ответ

4 голосов
/ 20 октября 2011

boost::mpl::_1 и boost::mpl::_2 являются заполнителями; они могут использоваться в качестве параметров шаблона, чтобы отличать привязку к фактическому аргументу для более позднего времени. При этом вы можете выполнять частичное применение (преобразование мета-функции, имеющей n-арность, в функцию, имеющую (nm) -арность), лямбда-выражения (создание мета-функции на лету там, где это необходимо) и т. Д.

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

В вашем примере, предполагая следующее typedef

typedef boost::flyweights::hashed_factory_class<
    boost::mpl::_1, 
    boost::mpl::_2, 
    boost::hash<boost::mpl::_2>,
    std::equal_to<boost::mpl::_2>,
    std::allocator<boost::mpl::_1>
> hashed_factory;

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

typedef typename
    boost::mpl::apply<
       hashed_factory,
       X,
       Y
    >::type result; // invoke hashed_factory with X and Y
                    // _1 is "replaced" by X, _2 by Y

Я не смотрел код Flyweight, но можно предположить, что _1 будет привязан к типу значения flyweight, а _2 - к типу ключа (так как он используется для хеширования и проверки равенства). В этом случае я думаю, что оба будут std::string, так как тип ключа не указан.

Я не уверен, что мое объяснение о заполнителях MPL достаточно ясное, не стесняйтесь читать превосходный учебник MPL , который очень хорошо объясняет метафункции, лямбда-выражения и другие функции метапрограммирования шаблонов.

...