Ich möchte Callbacks in einem Vektor oder einem anderen Container in C++11 speichern.
Ein Weg, dies zu tun, wäre ein Vektor von std::function zu speichern. Das funktioniert gut für Lambda oder std::bind mit kopierbaren Argumenten.
Wenn jedoch ein nicht kopierbares (nur verschiebbares) Argument vorhanden ist, schlägt es fehl aufgrund der Konvertierung vom internen Typ des Lambda/std::bind zu std::function...
#include
class NonCopyable {
public:
NonCopyable() = default;
NonCopyable(const NonCopyable &) = delete;
NonCopyable(NonCopyable &&) = default;
};
int main() {
std::vector> callbacks;
callbacks.emplace_back([] {});
NonCopyable tmp;
callbacks.emplace_back(std::bind([](const NonCopyable &) {}, std::move(tmp)));
// Beim Konvertieren des von std::bind zurückgegebenen Objekts zu einer std::function
// geschieht eine Kopie der Argumente, daher kann dieser Code nicht kompiliert werden.
return 0;
}
Gibt es einen Weg, die std::bind-Argumente in die std::function zu verschieben anstatt sie zu kopieren?