我在我的集合中使用 lambda 而不是比较器类,但我遇到了问题。
我有这样的事情:
class Processor {
private:
const function<bool(std::string, std::string)> _lenComp = [](string a, string b) { return a != b && a.size() >= b.size(); };
set<string, decltype(_lenComp)> _inputSet;
// ...
public:
Processor() : _inputSet() {
}
void addLine(string line) {
_inputSet.insert(line);
}
当我创建一个Processor
实例并调用addLine
两次时,我收到错误的函数调用异常。如何正确初始化此类?
decltype(_lenComp)
isfunction<bool(std::string, std::string)>
这是一个空的std::function
,所以在调用它时你会得到错误的调用。你想要的是存储在其中的 lambda 的类型,你应该使用 来定义它
static constexpr auto
,因为你不允许知道 lambda 的类型。扩展另一个答案:在这一行中, lambda 的类型和 的类型
_lenComp
不同:std::function<bool(string, string)>
是一个通用包装函子,可以容纳任何类型的返回 bool 并接受两个字符串的函数,无论是 lambda、常规函数还是静态方法。您可以重新分配此容器包装的实际实现。您所做的是创建一个具有不透明(隐藏)类型的 lambda 并将其存储在包装器的实例中。然后将包装器的类型传递到
std::set
模板中。构造时
_inputSet
它不知道你的 lambda。它将构造一个给定的比较器类型的新实例,在您的情况下是一个std::function
. 默认构造的std::function
是空的。如果您想保留上述内容,另一个修复方法
std::function
是在构造集合时将已有的比较器实例传递给集合,如下所示: