Neue Konstruktor Syntax ... ?



  • Hallo,

    ich versuche eine Beispiel einer Library mit MSVC 2017 zu bauen bekomme aber bei diesem Code Fehlermeldungen:

      const std::vector<char> buffer = []() {
        std::vector<char> buffer_(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
        std::replace(buffer_.begin(), buffer_.end(), '\n', ' ');
        std::replace(buffer_.begin(), buffer_.end(), '\\', ' ');
        return buffer_;
      } ();
    

    So wie ich verstehe soll der Buffer Vector mit dem Inhalt einer Textdatei initialisiert werden, aber wie die Syntax oben funktioniert soll, ist mir nicht ganz klar.

    Vielen Dank für eure Hilfe!



  • Das ist ein Lambda, das sofort ausgeführt wird.

    Du könntest auch schreiben:

    std::vector<char> lambda_to_initialize_my_vector() {
        std::vector<char> buffer_(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
        std::replace(buffer_.begin(), buffer_.end(), '\n', ' ');
        std::replace(buffer_.begin(), buffer_.end(), '\\', ' ');
        return buffer_;
    }
    
     const std::vector<char> buffer = lambda_to_initialize_my_vector();
    

    Die Frage ist jetzt nur, was das in sein soll.
    Edit: Aha, C++ will mal wieder lieber Funktionen machen als Variablen (warning: parentheses were disambiguated as a function declaration [-Wvexing-parse])... Also

    // ersetze dieses
    std::vector<char> buffer_(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
    // durch
    std::vector<char> buffer_{std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>()};
    // oder
    std::vector<char> buffer_((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
    // oder
    auto buffer_ = std::vector<char>(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
    


  • Danke für den Hinweis auf die Lamba Syntax. Interessant!
    Ein Beispiel welches kompiliert ist folgendes:

    int main() {
      std::ifstream in("file.lib", std::fstream::in);
      
      const std::vector<char> buffer = [&in]() {
    	  std::vector<char> buffer_{ std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>() };
        std::replace(buffer_.begin(), buffer_.end(), '\n', ' ');
        std::replace(buffer_.begin(), buffer_.end(), '\\', ' ');
        return buffer_;
      } ();
      
      return 0;
    }
    

    Das buffer_ mit {} aufgerufen wird scheint mir auch noch neu, bzw. ist es der Body vom Constructor?




Log in to reply