gpt4 book ai didi

c++ - 在函数模板中使用 lambda,无法推断类型,makeSet() 用例

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:17 25 4
gpt4 key购买 nike

我想要实现的是一个接受三个参数的 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。

是否有任何解决方案或解决方法?如果您能告诉我正确的方法,我将不胜感激。

最佳答案

lambda 表达式的类型是未命名的类类型(它的闭包类型),而不是 std::function。因此,您不能从中推断出 std::functionMonad

你最好的选择是做标准库做的事情,并简单地接受任何东西作为谓词:

template <
class Iterator,
class UnaryFunction
>
auto makeSet(Iterator first, Iterator last, UnaryFunction f) -> std::set<decltype(f(*first))>
{
std::set<decltype(f(*first))> res;
for (; first != last; ++first) res.insert(f(*first));
return res;
}

请注意,您可能必须将 decltype 包装在 std::remove_reference 和/或 std::remove_cv 中以涵盖所有极端情况(或者,按照 @Yakk 的建议,std::decay)。

此外,为避免重复发明轮子,您可能需要查看 Boost.Range图书馆。

关于c++ - 在函数模板中使用 lambda,无法推断类型,makeSet() 用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42346297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com