¿Hay alguna manera de pasar una referencia como argumento a un argumento de nombre de tipo de plantilla? Quiero decir que en lugar de pasar un int, por ejemplo, pasar una referencia a un 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
}
Sé que puedo hacer que el miembro 'ptr' sea una referencia a un puntero al convertirlo en T en la clase, pero me preguntaba si esto se puede hacer desde el argumento que se pasa al argumento de plantilla.
decltype
, porque tomando el título literalmente, simplemente podría escribirFoo<int*&>
Respuestas:
Usted está buscando
Foo<decltype(a) &> foo1(a)
.Una alternativa más oscura (que funciona en este caso específico) es
Foo<decltype((a))> foo1(a)
.fuente
decltype
funciona de manera diferente dependiendo de si le das un nombre de variable o algo más (una expresión arbitraria).decltype(a)
devuelve el tipo de la variablea
(porque simplemente le dio un nombre de variable).decltype((a))
, por otro lado, le proporciona el tipo de expresión(a)
(que también lo esint
), con una referencia adicional que indica la categoría de valor de la expresión. [1/2](a)
(así comoa
) es un valor l, que se indica mediante&
(los valores x están representados por&&
, los valores no cambian el tipo en absoluto). Dado que las expresiones nunca tienen tipos de referencia, el hecho de quedecltype
pueda agregar referencias al tipo no puede causar ningún conflicto. [2/2]Como alternativa a la respuesta anterior, puede usar std :: reference_wrapper
fuente