Gibt es eine Möglichkeit, eine Referenz als Argument an ein Argument für den Vorlagentypnamen zu übergeben? Ich meine dies, anstatt beispielsweise ein int zu übergeben, um einen Verweis auf ein int zu übergeben.
template <typename T>
struct Foo
{
Foo(T arg) : ptr(arg) {}
T ptr;
};
int main()
{
int* a = new int(6);
Foo<decltype(a)> foo1(a); // ptr is a copy of a pointer
Foo<decltype(&a)> foo1(&a); // ptr seems to be a pointer to a pointer
}
Ich weiß, dass ich das 'ptr'-Mitglied als Referenz auf einen Zeiger festlegen kann, indem ich es in der Klasse als T & bezeichne, aber ich habe mich gefragt, ob dies anhand eines Arguments möglich ist, das an das Vorlagenargument übergeben wird.
decltype
, denn wenn Sie den Titel wörtlich nehmen, können Sie einfach schreibenFoo<int*&>
Antworten:
Du suchst
Foo<decltype(a) &> foo1(a)
.Eine obskurere Alternative (die in diesem speziellen Fall funktioniert) ist
Foo<decltype((a))> foo1(a)
.quelle
decltype
unterschiedlich, je nachdem, ob Sie ihm einen Variablennamen oder etwas anderes geben (einen beliebigen Ausdruck).decltype(a)
Gibt den Typ der Variablen zurücka
(weil Sie ihr einfach einen Variablennamen gegeben haben).decltype((a))
Auf der anderen Seite erhalten Sie den Typ des Ausdrucks(a)
(der auch vorhanden istint
) mit einer zusätzlichen Referenz, die die Wertekategorie des Ausdrucks angibt. [1/2](a)
(sowiea
) ist ein l-Wert, der durch angezeigt wird&
(x-Werte werden durch dargestellt&&
, pr-Werte ändern den Typ überhaupt nicht). Da Ausdrücke niemals Referenztypen haben, kann die Tatsache, dassdecltype
dem Typ Referenz hinzugefügt werden kann, keine Konflikte verursachen. [2/2]Alternativ zur vorherigen Antwort können Sie std :: reference_wrapper verwenden
quelle