2012-05-21 32 views
2

我有一個情況我有一系列的成員函數產生一個目標對象的簡單信息:如何使用boost綁定組合多個函子?

double MyDoc::GetX(thing) 
double MyDoc::GetY(thing) 
etc. 

我在同一個班做了一些「非常格式化」的成員函數:

string MyDoc::PrintOne(thing, std::function<double (THING*)>) 

你會發現,漂亮的打印機功能需要一個數據的函數 - 也就是說,它是組合的,這樣我可以創建各種類型的有關目標的信息,併產生一個「漂亮的打印」串吧。

在直接使用中,這種技術的工作很好。

但是,我真正想要的當前應用程序是組合這些實體的多個層次 - 即爲上述組合作爲一個整體有效創建一個函子(函數對象),以便我可以指定漂亮的打印機功能,它是數據採集功能,並在稍後調用。模式是z(x)→f(x,g(x)):

auto Z = [&] (THING* thing) { 
    return boost::bind(
     &MyDoc::PrintOne, 
     this, 
     _1, 
     boost::bind(MyDoc::GetX, this, _1)); 
} 

這裏是我遇到問題的地方。我正在試圖讓語法正確,或者我對boost :: bind語法和C++ lambda語法感到困惑,或者我只是從根本上誤解了某些東西?

基本上,我想編寫一個函數Z,它需要一個THING *和另一個函數X,它還需要一個THING *,並且使用它自己的邏輯爲給定的THING *生成一個字符串輸出。

我有變化 - 有些需要兩個數據存取器類型的功能,或者可能是一個bool +數據存取器。沒有關係 - 底線應該是相同的:

如何在Z - > F(x,G(x))處編寫Z?

感謝您的幫助!

+0

@ildjarn - 似乎在做詭計! – Mordachai

+1

「我在同一個班級中做了一些」漂亮的格式化「成員函數...」 - 太糟糕了:( –

回答

2

boost::bind(和std::bind熱切評估嵌套綁定表達式,所以你有什麼可以匹配的簽名string MyDoc::PrintOne(THING*, double)。爲了防止及早求值,並返回直接嵌套bind表達式(適合用於構造std::function<>),使用boost::protect

boost::bind(
    &MyDoc::PrintOne, 
    this, 
    _1, 
    boost::protect(boost::bind(&MyDoc::GetX, this, _1)) 
) 

這在文檔的標題爲「using nested binds for function composition」的部分中概述。

+0

我幾次讀到鏈接的「文檔」,它非常有用,我認爲我可能需要使用保護,但沒有任何理解,我不想只是把它放在沒有任何理解的地方。 – Mordachai