c++ 当使用std::function作为比较器时,函数调用错误

wj8zmpe1  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(139)

我在我的集合中使用了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次时,我得到了一个错误的函数调用异常。如何正确初始化这个类?

6ss1mwsb

6ss1mwsb1#

decltype(_lenComp)function<bool(std::string, std::string)>,它是一个空的std::function,所以你在调用它时会得到错误的调用。
你想要的是存储在其中的lambda的类型,你应该用static constexpr auto定义它,因为你不允许知道lambda的类型。

class Processor {
    
private:
    static constexpr auto _lenComp = [](string a, string b) { return a != b && a.size() >= b.size(); };
    set<string, decltype(_lenComp)> _inputSet;
};
x33g5p2x

x33g5p2x2#

另一个答案:在这一行中,lambda的类型和_lenComp的类型是不同的:

const function<bool(std::string, std::string)> _lenComp = [](string a, string b) { return a != b && a.size() >= b.size(); };

std::function<bool(string, string)>是一个通用的 Package 函子,它可以保存任何类型的函数,这些函数返回bool并接受两个字符串,无论是lambda,还是常规函数,还是静态方法。您可以重新分配此容器 Package 的实际实现。
你所做的就是创建一个具有不透明(隐藏)类型的lambda,并将其存储在 Package 器的示例中。然后将 wrapper 的类型传递到std::set模板中。
_inputSet被构造时,它不知道你的lambda。它将构造一个给定的比较器类型的新示例,在本例中是std::function。默认构造的std::function是空的。
如果你想保留std::function,另一个解决方法是在构造比较器的时候将它的示例传递给set,就像这样:

// ...

    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({}, _lenComp) {}

// ...

相关问题