Existe-t-il un moyen de passer une référence en tant qu'argument à un argument de nom de type de modèle? Je veux dire donc au lieu de passer un int, par exemple, pour passer une référence à 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
}
Je sais que je peux faire du membre 'ptr' une référence à un pointeur en le faisant T & dans la classe, mais je me demandais si cela pouvait être fait à partir d'un argument passé à l'argument modèle.
decltype
, car en prenant le titre à la lettre, vous pourriez simplement écrireFoo<int*&>
Réponses:
Vous cherchez
Foo<decltype(a) &> foo1(a)
.Une alternative plus obscure (qui fonctionne dans ce cas spécifique) est
Foo<decltype((a))> foo1(a)
.la source
decltype
fonctionne différemment selon que vous lui donnez un nom de variable ou autre chose (une expression arbitraire).decltype(a)
renvoie le type de la variablea
(car vous lui avez simplement donné un nom de variable).decltype((a))
, d'autre part, vous donne le type de l' expression(a)
(qui l'est aussiint
), avec une référence ajoutée qui indique la catégorie de valeur de l'expression. [1/2](a)
(ainsi quea
) est une valeur l, qui est indiquée par&
(les valeurs x sont représentées par&&
, les valeurs pr ne changent pas du tout le type). Étant donné que les expressions n'ont jamais de types de référence, le fait dedecltype
pouvoir ajouter une référence au type ne peut pas provoquer de conflits. [2/2]Comme alternative à la réponse précédente, vous pouvez utiliser std :: reference_wrapper
la source