2011-07-07 43 views
4

boost::bind的對話中,有人指出std::bind1st存在於C++ 03中,但它「幾乎不可用」。爲什麼std :: bind1st被認爲是「幾乎不可用」?

我找不到任何堅實的東西來支持這件事。

The boost::bind documentation說:

的boost ::綁定是的 標準功能的std :: bind1st的std :: bind2nd的推廣。它支持任意 函數對象,功能,功能 指針和成員函數 指針,並且能夠任意 參數綁定到特定值或路線 輸入參數爲任意 位置。 綁定沒有對函數對象放置任何 要求; 特別是,它並不需要 result_type的first_argument_typesecond_argument_type標準 的typedef。

或許表明這些限制適用於std::bind1st

除了對參數的數目明顯的限制,什麼boost::bindstd::bind1st/std::bind2nd優勢?在C++ 03中,std::bind1st「幾乎不可用」的說法有什麼好處嗎?

回答

7

如果我們看看C++ 03 20.3.6.1和20.3.6.2,那麼我們看到對於bind1st的函子參數,我們需要三個typedef(對於結果類型,第一個和第二個參數),並且結果運算符只需要一個參數。

這意味着我們不能簡單地在簡單函數指針上使用bind1st,因爲它們沒有那些typedef s。此外,我們只能在二進制函數上使用bind1st,因爲我們不支持更多參數。此外,boost::bind等人具有能夠重新排序參數的優點,並且當然不僅支持第一參數。

在我看來,活頁夾的大多數用例都是用於自由函數和成員函數,而不是函數對象;因此bind1st的使用是相當有限的(儘管可以通過使用其他工具如ptr_fun進行擴展,但它是否使得它更易於使用是值得懷疑的)。當然這只是基於個人經驗,但有人可能想要爲bind1st做Google代碼搜索統計。

+1

請注意,'ptr_fun'解決了第一個問題,通過爲您提供一個包含指定函數指針的可調整二進制函數。儘管如此,並沒有解決其他問題。調用'ptr_fun'很容易,記得稍微難一些;-) –

2

的類型的函數調用操作者bind1st返回是

typename Operation::result_type 
operator()(const typename Operation::second_argument_type& x) const; 

這不會與結合的功能對象和非常嚴格的C++編譯器03(更近的版本是更的參考參數工作LAX)。 C++ 03禁止引用參考。

+0

不應該引用崩潰?我想我讀了類似typedefs的東西,和'const'一樣。 – Xeo

+0

@Xeo不在C++ 03中。有些人也使用它[區分C++ 03和C++ 0x](http://stackoverflow.com/questions/6473218/what-differences-if-any-between-c03-and-c0x-can-在運行時檢測/ 6473994#6473994),儘管最近編譯器無法工作。 –

相關問題