如何传递对模板typename参数的引用


15

有没有办法将引用作为参数传递给模板typename参数?我的意思是说,而不是通过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
}

我知道我可以通过在类中使其成为T&来使'ptr'成员成为对指针的引用,但是我想知道是否可以通过传递给模板参数的参数来实现。


我想您想留下来decltype,因为从字面意义Foo<int*&>
上讲,

Answers:


18

您正在寻找 Foo<decltype(a) &> foo1(a)

更为晦涩的替代方法(在这种情况下适用)是Foo<decltype((a))> foo1(a)


1
嗯,这很有意义,谢谢。decltype((a))中的双括号如何工作?如何使其成为参考?
斑马鱼

2
@Zebrafish基本上,decltype根据您给它命名的是变量名还是其他名称(任意表达式),其工作方式有所不同。decltype(a)返回变量的类型a(因为您只是给了它一个变量名)。decltype((a))另一方面,为您提供了表达式 的类型(a)(也是int),并带有附加的引用性来指示表达式的值类别。[1/2]
HolyBlackCat

(a)(以及a)是一个左值,由表示&(x 值由表示&&,pr值根本不改变类型)。由于表达式从不具有引用类型,因此decltype可以为该类型添加引用性的事实不会引起任何冲突。[2/2]
HolyBlackCat

2

作为上一个答案的替代方法,您可以使用std :: reference_wrapper

std :: reference_wrapper是一个类模板,它将引用包装在可复制的可分配对象中。它通常用作一种将引用存储在标准容器(如std :: vector)中的机制,这些容器通常无法保存引用。

#include <functional>

template <typename T>
struct Foo
{
  Foo(T arg) : ptr(arg)
  {
  }
  T ptr;
};

int main()
{
  int* a = new int(6);

  Foo<std::reference_wrapper<int*>> foo1(std::ref(a));
  foo1.ptr[0] = 1;  // ok

  // This also works
  int* b = new int(6);
  Foo<std::reference_wrapper<decltype(b)>> foo2(std::ref(b));
  // and this too
  foo1 = foo2;

  // Or, if you use c++17, even this
  Foo foo3(std::ref(b));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.