Desidero memorizzare callback in un vettore o in un altro contenitore in C++ 11.Come archiviare la funzione std :: non copiabile in un contenitore?
Un modo per farlo sarebbe memorizzare un vettore di std :: function. Questo funziona bene per lambda o std :: bind con argomenti copiabili.
Tuttavia, se v'è una non copiabile (solo mobile) argomenti, viene sicuro a causa della conversione dalla lambda/std :: bind tipo interno alla std :: funzione ...
#include <vector>
class NonCopyable {
public:
NonCopyable() = default;
NonCopyable(const NonCopyable &) = delete;
NonCopyable(NonCopyable &&) = default;
};
int main() {
std::vector<std::function<void()>> callbacks;
callbacks.emplace_back([] {});
NonCopyable tmp;
callbacks.emplace_back(std::bind([](const NonCopyable &) {}, std::move(tmp)));
// When converting the object returned by std::bind to a std::function,
// a copy of the arguments happen so this code cannot compile.
return 0;
}
C'è un modo per spostare std :: bind argomenti nella funzione std :: invece di copiarli?
'std :: function' richiede il functor che esso racchiude come CopyConstructible, quindi sei sfortunato. –
Quindi c'è un modello migliore per memorizzare i callback? Ti piace packaged_task o un'altra classe? –
Memorizza i puntatori alle funzioni o ai funtori, forse? – Cinch