la seguente:std :: bind non ha senso per me qualunque
#include <functional>
struct Foo
{
void bar1() {}
void bar2(int) {}
void bar3(int, int) {}
void bar4(int, int, int) {}
};
int main()
{
Foo foo;
auto f1 = std::bind(&Foo::bar1, &foo);
auto f2 = std::bind(&Foo::bar2, &foo);
auto f3 = std::bind(&Foo::bar3, &foo);
auto f4 = std::bind(&Foo::bar4, &foo);
f1(1, 2, 3, 4); // success
f2(1, 2, 3); // error
f3(1, 2); // error
f4(1); // error
return 0;
}
f1 (1, 2, 3, 4) compila ed esegue bar1(). f2 (1, 2, 3), non viene compilato, f3 (1, 2) non viene compilato (tuttavia bar3 ha il prototipo corretto) e f4 (1) non viene compilato. L'errore che ottengo con Visual Studio 2013 per questi 3 casi è
"la classe non definisce un 'operatore()' o un operatore di conversione definito dall'utente su un puntatore a funzione o un riferimento a funzione che richiede numero appropriato di argomenti "
Ho una comprensione limitata dei modelli e della libreria standard, ma questo non sembra avere alcun senso logico per me. C'è una spiegazione ragionevole semplice?
La mia soluzione personale per 'std :: bind': è C++ 11 e tu hai lambda, non pensarci più. 'auto f1 = [&]() {pippo.bar1()};' –
Probabilmente hai dimenticato di mettere i segnaposto (_1, _2, _3) in 'f2',' f3', 'f4'. @Matteo Italia 'bind' è a volte più conciso di un lambda. – sbabbi
OK, quindi f1 (1, 2, 3, 4) che si lega a bar1() non ha bisogno di alcun segnaposto. Ma poiché operator() non "controlla" arity, viene chiamato bar1() e (1, 2, 3, 4) viene scartato dal template magic, senza errori. – Robinson