【发布时间】:2017-02-20 13:48:37
【问题描述】:
我想要实现的是一个 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。
有什么解决方案或解决方法吗? 如果您能告诉我正确的方法,我将非常感激。
【问题讨论】:
标签: c++ c++11 templates lambda type-deduction