Existe uma maneira de passar uma referência como argumento para um argumento de nome de tipo de modelo? Quero dizer, em vez de passar um int, por exemplo, para passar uma referência a um 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
}
Eu sei que posso fazer com que o membro 'ptr' seja uma referência a um ponteiro, tornando-o T & na classe, mas fiquei pensando se isso pode ser feito a partir do argumento passado para o argumento do modelo.
decltype
, porque, ao pegar o título literalmente, você pode simplesmente escreverFoo<int*&>
Respostas:
Você está procurando
Foo<decltype(a) &> foo1(a)
.Uma alternativa mais obscura (que funciona neste caso específico) é
Foo<decltype((a))> foo1(a)
.fonte
decltype
funciona de maneira diferente dependendo se você atribui um nome de variável ou outra coisa (uma expressão arbitrária).decltype(a)
retorna o tipo da variávela
(porque você simplesmente deu um nome à variável).decltype((a))
, por outro lado, fornece o tipo da expressão(a)
(que também éint
), com referência adicional que indica a categoria de valor da expressão. [1/2](a)
(e tambéma
) é um lvalue, indicado por&
(xvalues são representados por&&
, prvalues não alteram o tipo). Como as expressões nunca têm tipos de referência, o fato dedecltype
poder adicionar referência ao tipo não pode causar conflitos. [2/2]Como alternativa à resposta anterior, você pode usar std :: reference_wrapper
fonte