2014-06-07 8 views
8

Nämlich:Was ist der einfachste Weg, um eine lokale Variable mit demselben Typ wie ein abgeleitetes Argument zu erstellen?

[](auto const& foo) { 
    ??? bar; // should be same base type as foo, minus const& 
} 

Bisher verwende ich:

typename std::remove_const<typename std::remove_reference<decltype(foo)>::type>::type combination 

Aber ich hoffe wirklich Theres eine einfachere Alternative!

+1

Soweit ich gelesen habe, war ich 'Auto' Typ Abzugssemantik, aber an einem Ort, wo ich' Decltype' verwenden muss, da ich keinen Ausdruck zuordnen. Sie haben 'decltype (auto) foo = bar' für das umgekehrte Problem eingeführt, aber jetzt will ich' declltype (bar) foo; ';) – mmocny

Antwort

10

std::decay<decltype(whatever)>::type oder decay_t wenn Ihre std Bibliothek damit aktualisiert wurde.

Es emuliert verschiedene Arten von Funktionsargumentzerfällen. Es handhabt, wenn Ihr arg eine Referenz zur Funktion war. Bei Referenz auf Array erzeugt es auch einen Zeiger, der weniger ideal ist.

Wenn Sie diese anders handhaben möchten, müssen Sie Ihre eigenen rollen.

+0

+1 wusste nicht' zerfall' entfernte Referenz – Praetorian

+0

Brilliant! Ja, es hat Unterstützung für 'std :: decay_t', also noch besser. – mmocny