是否有方法将引用作为参数传递给模板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
}
我知道我可以通过将"ptr"成员设置为T&在类中,但我想知道这是否可以通过传递给模板参数的参数来完成。
您正在寻找Foo<decltype(a) &> foo1(a)
。
一个更模糊的替代方案(在这种特定情况下有效(是Foo<decltype((a))> foo1(a)
。
作为上一个答案的替代方案,您可以使用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));
}