【问题标题】:Boost.flyweight and Boost.MPLBoost.flyweight 和 Boost.MPL
【发布时间】:2011-10-20 07:17:33
【问题描述】:

我有一个关于享元选项的问题,给出下面的定义,基于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::_1boost::mpl::_2 有什么价值?什么时候分配?

boost::mpl::_1 很可能是std::stringboost::mpl::_2 应该是 size_t 吗?如果属实,如何扣除? 我不明白 key_type 是如何选择的。

我已经阅读了http://www.boost.org/doc/libs/1_41_0/libs/flyweight/doc/tutorial/lambda_expressions.html,但这是我第一次接触 Boost.MPL,还不够:)

【问题讨论】:

    标签: c++ templates boost boost-mpl


    【解决方案1】:

    boost::mpl::_1boost::mpl::_2 是占位符;它们可以用作模板参数,以便稍后将绑定到实际参数。有了这个,您可以进行部分应用(将具有 n-arity 的元函数转换为具有 (nm)-arity 的函数)、lambda 表达式(在需要的地方即时创建元函数)等。

    至少包含一个占位符的表达式是一个占位符表达式,它可以像任何其他元函数一样被调用,并带有一些将替换占位符的参数。

    在您的示例中,假设以下 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
    

    我没有查看享元代码,但我们可以假设_1 将绑定到享元的值类型,_2 绑定到键类型(因为它用于散列和测试相等性)。在这种情况下,我认为两者都是std::string,因为没有指定密钥类型。

    我不确定我对 MPL 占位符的解释是否很清楚,请随意阅读 excellent MPL tutorial,它很好地解释了元函数、lambda 表达式和其他模板元编程特性。

    【讨论】:

    • 所以,key_type 由享元决定。但是我怎样才能确定类型并最终设置一个呢?关键是整数类型,而不是字符串,这一点非常重要。
    • 如果要指定用于检索对象的键,则需要使用key_value&lt;Key, Value&gt; 作为flyweight&lt;T&gt; 的参数。您还需要告诉库如何使用“键提取器”从值中检索键,该函子返回与作为参数给出的值对应的键。有关示例,请参见 the Boost.Flyweight tutorial
    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多