Есть ли способ передать ссылку в качестве аргумента аргументу типа имя шаблона? Я имею в виду, что вместо передачи int, например, чтобы передать ссылку на 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
}
Я знаю, что могу сделать член ptr ссылкой на указатель, сделав его T & в классе, но мне было интересно, можно ли это сделать из аргумента, который передается в аргумент шаблона.
decltype
, потому что буквально взяв название, вы можете просто написатьFoo<int*&>
Ответы:
Ты ищешь
Foo<decltype(a) &> foo1(a)
.Более неясная альтернатива (которая работает в этом конкретном случае)
Foo<decltype((a))> foo1(a)
.источник
decltype
работает по-разному в зависимости от того, даете ли вы ему имя переменной или что-то еще (произвольное выражение).decltype(a)
возвращает тип переменнойa
(потому что вы просто дали ей имя переменной).decltype((a))
с другой стороны, дает вам тип выражения(a)
(который такжеint
) с добавленной ссылкой, которая указывает категорию значения выражения. [1/2](a)
(также какa
) является lvalue, который обозначен&
(xvalues представлены&&
, prvalues вообще не изменяет тип). Поскольку выражения никогда не имеют ссылочных типов, тот факт, что ониdecltype
могут добавить ссылочную привязку к типу, не может вызвать каких-либо конфликтов. [2/2]В качестве альтернативы предыдущему ответу вы можете использовать std :: reference_wrapper
источник