Es gibt eine Bibliotheksfunktion, die ich aufrufen möchte, deren Signatur lautet:
%Vor% Ich habe eine std::string
Variable, ich möchte diese Funktion als Argument senden.
Gibt es eine Möglichkeit, die Variable std::string
direkt zu senden, ohne eine Kopie davon zu erstellen?
Es steht Ihnen natürlich frei, sich durchzuhacken, um das gewünschte Ergebnis zu erzielen. Aber Sie sollten sich auf eine summarische Ausführung durch Mitarbeiter oder Personen vorbereiten, die Ihren Code verwenden / pflegen / ändern oder portieren möchten ...
Druckt
%Vor%Wie in den Kommentaren richtig erwähnt, basiert diese Lösung darauf, dass der Vektor das folgende Datenlayout hat und dass die Zeichenfolge ihre Daten zusammenhängend speichern muss (nicht, ob dies durch den Standard vorgegeben ist).
%Vor%Es gibt keine Möglichkeit, dies zu tun, weil die Layouts der beiden Typen nicht in jeder Hinsicht ähnlich sind.
Der beste Ansatz besteht darin, WriteBinary
so zu reparieren, dass stattdessen "iterators" verwendet wird:
Oder Vorlage es:
%Vor%Und dann kannst du es für Strings, Vektoren oder jeden anderen Container verwenden, den du magst!
Andernfalls können Sie den Iterator-Konstruktor verwenden, um die Kopie so effizient wie möglich zu erstellen:
%Vor% Ich fürchte, das ist nicht möglich. Weder string
noch vector
haben einen Konstruktor, der es erlauben würde, einen bereits vorhandenen Puffer zu übernehmen. Und es ist sehr wahrscheinlich, dass sich das Speicherlayout von string
und vector
unterscheidet, daher ist kein Casting möglich.
Gibt es eine Möglichkeit, die Variable std :: string direkt zu senden eine Kopie davon machen?
Nein, sicher nicht sicher.
Wenn Sie die Kontrolle über die Bibliothek haben, würde ich einen kleinen Refactor vorschlagen.
Entweder hinzufügen:
%Vor%Oder:
%Vor% Und dann machen Sie Ihre bestehenden WriteBinary
und WriteString
rufen Sie es:
Oder:
%Vor%Ich persönlich würde den iteratorbasierten Ansatz bevorzugen. Es fühlt sich "sauberer" an.
(Hinweis: Für den Ansatz mit Zeiger / Größe möchten Sie wahrscheinlich auf "leer" prüfen. Einige Implementierungen werden möglicherweise aktiviert, wenn Sie das Ergebnis von begin()
für einen leeren Vektor / String ablehnen.)