Estou usando lambdas em vez de uma classe comparadora para meu conjunto, mas estou tendo problemas.
Eu tenho algo assim:
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);
}
Quando crio uma Processor
instância e chamo addLine
2 vezes, recebo uma exceção de chamada de função incorreta. Como inicializo corretamente esta classe?
decltype(_lenComp)
éfunction<bool(std::string, std::string)>
que está vaziostd::function
, então você recebe uma chamada ruim ao chamá-lo.o que você queria era o tipo de lambda armazenado nele, você deveria definir isso com
static constexpr auto
, pois não é permitido saber o tipo de lambda.Para expandir a outra resposta: nesta linha o tipo de lambda e o tipo de
_lenComp
não são iguais:std::function<bool(string, string)>
é um functor wrapper genérico que pode conter qualquer tipo de função que retorne um bool e receba duas strings, seja um lambda, uma função regular ou um método estático. Você pode reatribuir a implementação real que esse contêiner encapsula.O que você fez foi criar um lambda que possui um tipo opaco (oculto) e armazená-lo em uma instância do wrapper. Então você passou o tipo do wrapper para o
std::set
modelo.Quando
_inputSet
é construído, ele não tem conhecimento do seu lambda. Ele construirá uma nova instância do tipo de comparador fornecido, que no seu caso é um arquivostd::function
. E um padrão construídostd::function
está vazio.Outra correção para o problema acima, se você quiser manter,
std::function
seria passar a instância do comparador que você já possui para o conjunto quando ele for construído, assim: