2016-12-08 1 views
2

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

Répondre

6

std::bind exige de vous pour spécifier tous les paramètres. Donc, ceux qui devraient être passés à l'objet fonction résultant, doivent être des espaces réservés.

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); 
     }, _1, _2, _3, std::move(stringToMove));