Czy istnieje sposób na przekazanie odwołania jako argumentu do argumentu o nazwie szablonu? Mam na myśli, że zamiast przekazać int, na przykład przekazać referencję do int.
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
}
Wiem, że mogę sprawić, by element „ptr” był odniesieniem do wskaźnika, ustawiając go jako T & w klasie, ale zastanawiałem się, czy można to zrobić z argumentu przekazanego do argumentu szablonu.
decltype
, ponieważ biorąc tytuł dosłownie, możesz po prostu napisaćFoo<int*&>
Odpowiedzi:
Szukasz
Foo<decltype(a) &> foo1(a)
.Bardziej niejasną alternatywą (która działa w tym konkretnym przypadku) jest
Foo<decltype((a))> foo1(a)
.źródło
decltype
działa inaczej w zależności od tego, czy nadasz mu nazwę zmiennej, czy coś innego (dowolne wyrażenie).decltype(a)
zwraca typ zmienneja
(ponieważ po prostu nadałeś jej nazwę zmiennej).decltype((a))
, z drugiej strony, podaje typ wyrażenia(a)
(które jest równieżint
), z dodaną referencją, która wskazuje kategorię wartości wyrażenia. [1/2](a)
(oraza
) to wartość, na którą wskazuje&
(wartości x są reprezentowane przez&&
, wartości nie zmieniają wcale typu). Ponieważ wyrażenia nigdy nie mają typów odwołań, fakt, żedecltype
można dodać odwołanie do typu, nie może powodować żadnych konfliktów. [2/2]Alternatywą dla poprzedniej odpowiedzi jest użycie std :: reference_wrapper
źródło