gpt4 book ai didi

c++11 - 带有 std::function 参数的函数不接受 lambda 函数

转载 作者:行者123 更新时间:2023-12-04 17:19:51 26 4
gpt4 key购买 nike

我试图通过实现 std::iterator 来更加熟悉 C++11 标准在我自己的双向链表集合上,也试图制作我自己的 sort函数对其进行排序。

我想要 sort函数接受 lamba 作为一种排序方式,通过制作 sort接受 std::function , 但它不编译(我不知道如何实现 move_iterator ,因此返回集合的副本而不是修改传递的集合)。

template <typename _Ty, typename _By>
LinkedList<_Ty> sort(const LinkedList<_Ty>& source, std::function<bool(_By, _By)> pred)
{
LinkedList<_Ty> tmp;
while (tmp.size() != source.size())
{
_Ty suitable;
for (auto& i : source) {
if (pred(suitable, i) == true) {
suitable = i;
}
}
tmp.push_back(suitable);
}
return tmp;
}

我对函数的定义是错误的吗?如果我尝试调用该函数,则会收到编译错误。

LinkedList<std::string> strings{
"one",
"two",
"long string",
"the longest of them all"
};

auto sortedByLength = sort(strings, [](const std::string& a, const std::string& b){
return a.length() < b.length();
});

Error: no instance of function template "sort" matches the argument list argument types are: (LinkedList, lambda []bool (const std::string &a, const std::string &)->bool)

附加信息,编译也给出了以下错误:

Error 1 error C2784: 'LinkedList<_Ty> sort(const LinkedList<_Ty> &,std::function)' : could not deduce template argument for 'std::function<bool(_By,_By)>'


更新:我知道排序算法不正确,不会做我想做的事,我无意保持原样,一旦声明正确,修复它也没有问题.

最佳答案

问题是在 std::function 中使用的 _By 无法从 lambda 闭包中推断出来。您需要传入一个实际的 std::function 对象,而不是 lambda。请记住,lambda 表达式的类型是未命名的类类型(称为闭包类型),不是std::function

你所做的有点像这样:

template <class T>
void foo(std::unique_ptr<T> p);

foo(nullptr);

在这里,也没有办法从参数中推导出 T

标准库通常如何解决这个问题:它不会以任何方式将自己限制为 std::function,而只是将谓词的类型作为其模板参数:

template <typename _Ty, typename _Pred>
LinkedList<_Ty> sort(const LinkedList<_Ty>& source, _Pred pred)

这样,闭包类型就推导出来了。

请注意,您根本不需要 std::function — 只有当您需要存储仿函数时才需要它,或通过运行时接口(interface)(不是像模板那样的编译时接口(interface))传递它。


旁注:您的代码使用的标识符是为编译器和标准库保留的(标识符以下划线开头,后跟大写字母)。这在 C++ 中是不合法的,您应该避免在您的代码中使用此类保留标识符。

关于c++11 - 带有 std::function 参数的函数不接受 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34490845/

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