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



是否有方法将引用作为参数传递给模板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));
}

相关内容

  • 没有找到相关文章

最新更新