2011-10-20 61 views
5

我有一個關於輕量級選項的問題,下面給出的定義,基於http://www.boost.org/doc/libs/1_40_0/libs/flyweight/test/test_basic.cppBoost.flyweight和Boost.MPL

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第一次接觸是不夠:)

回答

4

boost::mpl::_1boost::mpl::_2是佔位符;它們可以用作模板參數,以便在稍後的時間將綁定與實際參數不同。有了這個,你可以進行部分應用(將具有n元的元函數轉換爲具有(nm) - 函數的函數),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 

我沒有查看Flyweight代碼,但我們可以假設_1將被綁定到flyweight的值類型,_2將被綁定到鍵類型(因爲它用於散列和測試相等)。在這種情況下,我認爲兩者都是std::string,因爲沒有指定密鑰類型。

我不確定我對MPL的佔位符的解釋是非常清楚的,隨時閱讀excellent MPL tutorial解釋非常好的元功能,lambda表達式和其他模板元編程功能。

+0

所以,key_type由flyweight決定。但是,我怎樣才能確定類型並最終設置一個?密鑰是一個整數類型而非字符串非常重要。 – vlg789

+0

如果要指定用於檢索對象的鍵,則需要使用'key_value '作爲'flyweight '的參數。你還需要告訴圖書館如何從一個值中檢索一個鍵,使用一個「鍵提取器」,一個函數返回與作爲參數給出的值相對應的鍵。有關示例,請參見[Boost.Flyweight教程](http://www.boost.org/doc/libs/1_47_0/libs/flyweight/doc/tutorial/key_value.html)。 –