2013-12-23 28 views
3

所以我有什麼是:部分與升壓結合::綁定

兩個範圍的元素:

std::vector<int> v1; 
std::vector<string> v2; 

功能接受元素從theese範圍:

void bar(int x, std::string str); 

而我想要做的是從v1和v2產品中的每一對應用處理程序。所以我有這樣的事情:

using namespace boost; 
for_each(v1, [&](int x) 
    { for_each(v2, bind(bar, x, _1)); } 
); 

這是確定的,但我得到了,因爲它們是C++ 11非標準的一部分,這部分代碼的潛在用戶仍然對替換C與其他不便++ lambda表達式98。我已經用函數替換了lambda,但是後來我想知道是否可以用oneline風格重寫它,而不需要額外的對象和/或函數。函子的變體是不錯,但我想完成的勘探在這裏:)

所以,我想是這樣的事情:

for_each(v1, for_each(v2, bind(bar, ???, _1))); 

我首先想到的是要結合內部的for_each到收到函數狀空洞簽名(int),但它對我來說很難,因爲for_each只有兩個參數 - 字符串範圍和函子接受一個參數 - 字符串。這對我來說意味着我必須在這裏使用綁定組合來擴展for_each簽名,所以它會從第一個範圍接收int元素。與自boost :: for_each的同時解決一些工作之後,我來到了這個代碼:

typedef boost::function<void(std::string)> StrFunc; 
typedef std::vector<std::string> StrRange; 

StrFunc maker(int i) { 
    return bind(bar, i, _1); 
} 

for_each(
    v1, 
    bind(
     static_cast< StrFunc (*) (const StrRange&, StrFunc)>( 
      for_each<StrRange, StrFunc>), 
     v2, 
     bind(maker, _1) 
    ) 
); 

此代碼的工作太 - 一元可調用對象是由製造商()函數完成的,其參數composively結合內部的for_each。但我仍然有幫助功能。當我試圖擺脫它,我所面臨的問題,這似乎不溶性的對我說:

for_each(
    v1, 
    bind(
     static_cast< StrFunc (*) (const StrRange&, StrFunc)>( 
      for_each<StrRange, StrFunc>), 
     v2, 
     bind(bar, _1, _1) //wat? 
    ) 
); 

因此,必須_1與外結合構成()條的第一個結合的說法。但是bar()的第二個參數也需要_1 for循環中使用綁定函數的內部for_each。所以,現在我需要以某種方式合成第一個參數,並保護第二個參數不受綁定時間的評估。

我發現的最相關的問題是here,但似乎它也無濟於事。

任何想法傢伙?

回答

0

爲什麼你不能只是做一樣簡單的東西:

BOOST_FOREACH(INT V,V1) { BOOST_FOREACH(字符串& S,V2) { 酒吧(V,S); } }

+0

我可以做到這一點,但我更喜歡儘量減少不必要的宏使用,從而決定編寫助手函數對象。 雖然整個問題都是哲學的 - 只是提出了一些使用boost :: bind的智力遊戲 – prez