我在我的集合中使用了Rolldas而不是一个比较器类,但是我遇到了一些问题。
我有这样的话:
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
2次时,我得到了一个错误的函数调用异常。如何正确初始化这个类?
2条答案
按热度按时间6ss1mwsb1#
decltype(_lenComp)
是function<bool(std::string, std::string)>
,它是一个空的std::function
,所以你在调用它时会得到错误的调用。你想要的是存储在其中的lambda的类型,你应该用
static constexpr auto
定义它,因为你不允许知道lambda的类型。x33g5p2x2#
另一个答案:在这一行中,lambda的类型和
_lenComp
的类型是不同的:std::function<bool(string, string)>
是一个通用的 Package 函子,它可以保存任何类型的函数,这些函数返回bool并接受两个字符串,无论是lambda,还是常规函数,还是静态方法。您可以重新分配此容器 Package 的实际实现。你所做的就是创建一个具有不透明(隐藏)类型的lambda,并将其存储在 Package 器的示例中。然后将 wrapper 的类型传递到
std::set
模板中。当
_inputSet
被构造时,它不知道你的lambda。它将构造一个给定的比较器类型的新示例,在本例中是std::function
。默认构造的std::function
是空的。如果你想保留
std::function
,另一个解决方法是在构造比较器的时候将它的示例传递给set,就像这样: