Dans mon code, j'utilise l'article 32 des conseils de Scott Meyers Effective Modern C++, où il explique comment passer à la capture en C++ 11. L'exemple de code fonctionne bien.Déplacer vers lambda capture C++ 11
class Some
{
public:
void foo()
{
std::string s = "String";
std::function<void()> lambda = std::bind([this](std::string& s) {
bar(std::move(s));
}, std::move(s));
call(std::move(lambda));
}
void bar(std::string)
{
// Some code
}
void call(std::function<void()> func)
{
func();
}
};
int main()
{
Some().foo();
}
J'ai ensuite essayé d'utiliser se déplacer dans la capture de manière plus difficile avec les paramètres, mais il ne fonctionne pas, il y a des erreurs de compilation. S'il vous plaît, aidez-moi à le réparer. Code avec erreur ci-dessous. J'ai joué avec, mais je n'ai pas trouvé de solution. Est-il possible de le faire?
class Some
{
public:
void foo()
{
std::string stringToMove = "String";
std::function<void(std::string, int, int)> lambda =
std::bind([this](std::string s, int i1, int i2, std::string& stringToMove) {
bar(std::move(stringToMove), i1, i2);
}, std::move(stringToMove));
call(std::move(lambda));
}
void bar(std::string, int, int)
{
// Some code
}
void call(std::function<void(std::string, int, int)> func)
{
func(std::string(), 5, 5);
}
};
int main()
{
Some().foo();
}
Erreurs:
code Gravité Description Lissage des lignes de fichier de projet État erreur C2672 'std :: Invoke': aucune fonction de surcharge correspondant trouvé Brouillons c: \ program files (x86) \ microsoft Visual studio 14.0 \ vc \ include \ type_traits 1468
gravité code description Suppression ligne fichier de projet État erreur C2893 Impossible de se spécialiser modèle de fonction « de type inconnu std :: Invoke (_Callable & &, _types & & ...) » Brouillons c: \ program files (x86) \ Microsoft Visual Studio 14.0 \ vc \ include \ type_traits 1468