2013-04-10 98 views
0

我試圖使用綁定,以產生一個函數:解除引用迭代器作爲升壓的一部分::結合複合鏈

  • 接收一個地圖米
  • 返回m.begin() - >第一

對於我試圖使用boost ::綁定:

typedef map<int,int>::const_iterator (map<int,int>::*const_begin_end)() const; 
bind(&pair<const int,int>::first, bind(static_cast<const_begin_end>(&map<int, int>::begin), _1)); 

這不起作用,因爲結果開始需要爲上真ferenced。我以爲像

bind(&pair<const int,int>::first, bind(&operator*, bind(static_cast<const_begin_end>(&map<int, int>::begin), _1))); 

但是,這是行不通的,因爲沒有全球運營商*。

問題:

  • 是否有可能實現這一目標使用boost ::綁定複合鏈?怎麼樣?
  • 更易讀的替代方案?

回答

1

我強烈推薦Boost.Phoenix,這是我去到圖書館當談到在C++ 03中編寫仿函數。它是Boost.Bind的優越替代品 - 圖書館正在展示其年代。例如,Phoenix讓我們在其仿函數上使用運算符來表示在調用函子時實際使用該運算符。因此arg1 + arg2是一個函數,它返回前兩個操作數的總和。這大大減少了bind噪音。第一次嘗試可能看起來像:

bind(&pair<const int, int>::first 
    , *bind(static_cast<const_begin_end>(&map<int, int>::begin), arg1))) 

LWS demo

但鳳凰的另一個優點是,它與一些電池。在我們的例子中,我們對<boost/phoenix/stl/container.hpp>非常感興趣,因爲這包括一些熟悉的容器操作的懶惰版本,包括begin。這是在我們的情況非常方便:

// We don't need to disambiguate which begin member we want anymore! 
bind(&pair<const int, int>::first, *begin(arg1)) 

LWS demo


最後一點,我要補充的是C++ 11綁定表達式指定,使得指針到成員工作任何東西使用operator*。所以外的即裝即用,你可以這樣做:

bind(&pair<const int, int>::first, bind(static_cast<begin_type>(&std::map<int, int>::begin), _1)) 

LWS demo

+0

謝謝,我必須閱讀關於這個圖書館。 – ricab 2013-04-11 09:24:26

1

可以調用成員函數指針的綁定,和成員運營商不外乎成員函數:

const_begin_end pBegin = &map<int,int>::begin; 
x = bind(&std::pair::first, 
    bind(&std::map<int, int>::const_iterator::operator*, 
     bind(pBegin, _1) 
    ); 

但嚴重的是,你可以也只寫一個適當的功能,做你所需要的,而不是這種無法讀取的boost.bind混亂(你可以說「可維護性」?)。

因此,對於C++ 03,一個功能:

template <class Map> 
typename Map::key_type keyBegin(Map const& m) 
{ 
    return m.begin().first; 
} 

或C++ 03仿函數(你可以在本地定義它自己的函數中)

struct KeyBegin 
{ 
    typedef std::map<int, int> IntMap; 
    int operator()(IntMap const& m) { 
    return m.begin().first; 
    } 
}; 

或C + +11的λ(超過綁定狂歡更具可讀性):

auto keyBegin = [](std::map<int, int> const& m) -> int { 
    return std::begin(m).first; 
}; 
+0

也許我沒有正確地解釋自己,但我想要的東西,不僅在地圖工作::爲const_iterator但對於任何迭代器(包括指針)。地圖的事情只是一個例子。 – ricab 2013-04-11 09:15:23