Aufruf von Funktionen mit std :: optionalen Parametern

8

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::stringstd::optional<std::string> ), um ihn mit einem C-String-Literal aufzurufen. Ich kann dies tun:

%Vor%

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:

%Vor%

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.

    
ThatsJustCheesy 06.02.2017, 00:41
quelle

2 Antworten

8

C ++ 14 fügt der Standardbibliothek eine Reihe von benutzerdefinierten Literalen hinzu, um Code weniger ausführlich zu machen. Es sieht ungefähr so ​​aus:

%Vor%

Sehen Sie sich auch dieses und dies als Referenz.

    
DeiDei 06.02.2017, 01:06
quelle
5

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%     
Guillaume Racicot 06.02.2017 01:14
quelle