2015-12-25 3 views
7

Für eine Vorlage Standardfall, brauche ich eine Funktion, die nichts weiter tut, als alles, was es als Argument erhält. Insbesondere sollten Referenzen, Konstanten usw. beibehalten werden. Das Schreiben von transparent(/* something */) sollte vollständig dem Schreiben /* something */ entsprechen.Funktion Weiterleitung Argument und einfach nichts zu tun

Ist die folgende Funktionsdefinition korrekt, um diesen Zweck zu erreichen?

template <class S> 
decltype(auto) transparent (S && s) { return std::forward<S> (s); } 
+0

Ich denke, dass die Implementierung korrekt ist. Aber was ist der Zweck? Sie haben grundsätzlich 'std :: forward' umbenannt. –

+0

'Vorlage struct Transform {/ * operator() sollte nichts tun * /}; Vorlage <> struct Transform {MyOtherType-Operator() (MyType t) {return wrap (t); }; '. Ich möchte es in einer Vorlage Funktion wie 'Return Transform {} (/ * was auch immer meine Funktion berechnet * /);' – JohnB

Antwort

3

ein constexpr hinzufügen und es ist so gut wie es geht. Prvalues ​​ergeben xvalues; Dies ist jedoch nicht verbesserungsfähig, da Prwerte und x-Werte nicht unter Verwendung der Überladungsauflösung unterschieden werden können.

Sie können nicht 0 als Null-Zeiger-Konstante oder String-Literale als Initialisierer ordnungsgemäß weiterleiten, aber die einzige Möglichkeit, das zu erreichen, wäre ein Makro (das ist nicht das, was Sie anstreben).

2

Ihre Implementierung ist in Ordnung, aber hier sind einige Dinge in den Sinn zu kommen:

Wenn ein Aufruf an transparent() ein rvalue std :: string, dann ist zu std abgeleitet: : string und std :: forward stellen sicher, dass ein rvalue Verweis zurückgegeben wird.

Wenn ein Anruf zu transparent() const lvalue std :: string geht, dann S auf const std :: string abgeleitet & und std :: nach vorne sorgt dafür, dass ein const lvalue Referenz kehrt

Wenn ein Anruf zu transparent() übergibt einen nicht-const lvalue std :: string, dann wird S std :: string abgeleitet & und std :: vorwärts sorgt dafür, dass eine nicht konstante lvalue Referenz zurück

Aber warum brauchen Sie das? Eine gemeinsame Nutzung std :: vorwärts in Vorlagen ist zum einen warpper wie folgt aus:

template<class T> 
void wrapper(T&& arg) 
{ 
    foo(std::forward<T>(arg)); // Forward a single argument. 
} 
+0

Ich brauche eine Metafunktion, die eine Weiterleitung, wenn ihr Parameter (der Parameter der Metafunktion) ist ein Typ und macht etwas anderes, wenn sein Parameter ein anderer Typ ist. Der Parameter für die Metafunktion ist unabhängig vom Typ des Ausdrucks, den ich weiterleite. – JohnB