關鍵問題是你不能接受一個超載集的地址:std::make_pair
是一個函數模板,你甚至沒有說明你在說什麼實例化。類似地,std::map<K, V>::insert
過載,例如,採用一個元素的版本和採用範圍的版本。
即使您可以採用某種形式的重載函數的地址,但實際上並不真的想要如果您能幫到它!原因是通過函數指針或成員函數指針進行調用比調用函數指針要花費多得多,並且通過函數指針進行調用更加困難:編譯器必須證明特定的[成員]函數指針始終引用到相同的[成員]功能。
解決這兩個問題的方法是給bind()
一個帶有模板函數調用操作符的函數對象,它簡單地委託給相應的函數。例如:
struct make_a_pair {
template <typename T0, typename T1>
std::pair<T0, T1> operator()(T0&& t0, T1&& t1) {
return std::make_pair(std::forward<T0>(t0), std::forward<T1>(t1));
}
};
當使用C++ 03你會使用T0 const&
和T1 const&
代替T0&&
和T1&&
和你只是傳遞,而不是使用std::forward<>()
的參數。在C++ 11設置中,您可能更願意使用decltype()
返回類型。插入一個類似的函數對象看起來是這樣的:
struct inserter {
template <typename M, typename T>
void operator()(M* map, T&& value) {
map->insert(std::forward<T>(value));
}
};
有了這兩個函數對象,你可以用你的bind()
表達式:
std::for_each(A.begin(), A.end(),
boost::bind(inserter(), &B, boost::bind(make_a_pair(), _1, _1)));
現在我不能很容易地測試這一點,但假設成對的_1
和_1
是理想的。看來,你真的想創建的關鍵,在這種情況下,你需要適當項目的初始地圖,例如按鍵的鍵的映射關係,使用另一個函數對象:
struct project1st {
template <typename T0, typename T1>
typename std::remove_const<T0>::type
operator()(std::pair<T0, T1> const& p) const {
return p.first;
}
};
這個函數對象如果有第一個T0
,則從const
中刪除const
(如果該對來自std::map<K, V>
,則該對將是std::pair<K const, V>
),然後返回結果。你會使用這個函數對象合適std::bind()
表達,即替換每個_1
,與
boost::bind(project1st(), _1)
試'的std :: make_pair <字符串,字符串>' – Raxvan
和'_1'你的情況是'的std ::對',而不僅僅是'string' –
更改'std :: make_pair'之後,您的'bind'調用將創建一個試圖將函數對象插入'B'的無函數對象。 – Simple