Ich habe eine Funktion, deren Signatur lautet:
%Vor% (Ich habe den Alias std::experimental::optional
, bis std::optional
offiziell verfügbar ist.)
Allerdings habe ich Schwierigkeiten, es sauber zu nennen. Der Compiler verweigert die Ausführung von zwei impliziten Konvertierungen ( const char*
➝ std::string
➝ std::optional<std::string>
), um ihn mit einem C-String-Literal aufzurufen. Ich kann dies tun:
Und der Compiler wird feststellen, dass ein std::optional
benötigt wird, und die Konvertierung durchführen. Dies ist jedoch viel zu ausführlich. Dank C ++ 11 kann ich das auch machen:
Obwohl dies besser ist , ist es immer noch nicht ideal. Ich möchte diese Funktion wie jede andere Funktion aufrufen können, die ein std::string
benötigt. Ist das möglich? Wenn die Funktion einen anderen Parametertyp annimmt, ist das in Ordnung, solange sie sich wie / direkt in std::optional
umwandelt. Danke.
Das kannst du mit ein paar Templates und sfinae machen:
%Vor% Diese Überladung wird ausgewählt, wenn eine Zeichenfolge mit einem weitergeleiteten T
konstruierbar wäre, aber nur, wenn std::optional<std::string>
nicht konstruierbar ist.
Ihre Funktion kann mit jedem Objekt aufgerufen werden, mit dem ein String erstellt werden kann:
%Vor%Tags und Links c++ c++-standard-library optional boost-optional