我想實現的是一個makeSet()函數,它接受三個參數,一對迭代器和一個轉換值的函數。在函數模板中使用lambda,不能推導出類型,makeSet()用例
一個用例可以創建從值序列一套,做轉型,例如,轉換std::map<K,V>
到std::set<std::pair<V,K>>.
客戶端代碼可能看起來像
auto s = makeSet(hash.begin(), hash.end(),
[](std::pair<int,int> x) { return std::make_pair(x.second, x.first); });
我當前的嘗試是跟着,
// (commented code are some other *failed* attempt).
template <typename Iterator,
typename T = typename std::iterator_traits<Iterator>::value_type,
template<typename ... > class Monad, typename R >
// typename R, typename Monad = std::function<R(T)> >
std::set<R> makeSet(Iterator first, Iterator last, Monad<R,T> f) {
std::set<R> res;
for (; first != last; ++first) res.insert(f(*first));
return res;
}
但不幸的是不起作用。該問題看起來像沒有推斷出R.
有沒有解決方法或解決方法? 如果你能告訴我正確的做法,我將非常感激。
哦,心愛的,有時挑剔decltype! – qeatzy
範圍是指使用範圍對象而不是一對迭代器,類似於[this](https://ericniebler.github.io/std/wg21/D4128.html),或者其他不同的東西? – qeatzy
我只是使用'std :: decay_t',因爲'decay_t'使得類型適合存儲。第二點是你幾乎不應該推導出'std :: function'的類型; 'std :: function'是一個類型擦除類,類型演繹和類型擦除是相反的。推導出要擦除的類型是設計缺陷的標誌。你擦除,因爲你需要一個固定的類型在這裏;你推斷,因爲你知道這裏的確切類型。如果你知道確切的類型,999/1000次你不需要固定類型。 –
Yakk