如何传递对模板类型名参数的引用

Zeb*_*ish 16 c++ templates

有没有办法将引用作为参数传递给模板类型名参数?我的意思是这样,而不是传递 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
}
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*Cat 19

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

一个更模糊的替代方案(在这种特定情况下有效)是Foo<decltype((a))> foo1(a).

  • @Zebrafish基本上, [`decltype`](https://en.cppreference.com/w/cpp/language/decltype) 的工作方式有所不同,具体取决于您是否给它一个变量名或其他名称(任意表达式)。`decltype(a)` 返回变量 `a` 的类型(因为您只是给了它一个变量名)。另一方面,“decltype((a))”为您提供*表达式*“(a)”的类型(也是“int”),并添加了指示表达式的值类别的引用性。[1/2] (2认同)