模板类型的引用是什么意思?
问题描述:
在我试图理解我看到构造这样的代码:ref<date>(entry)
。请问任何人,请解释它的意思。模板类型的引用是什么意思?
我假设我们创建了一个对entry
对象的引用,但是如何使用date
类型。例如,ref<date>(entry)
和ref<location>(entry)
将返回不同的值。它是如何工作的?
答
如果您有using namespace std;
并且包含<functional>
标题,这是指std::ref
函数。
std::ref
是将创建一个std::reference_wrapper
包裹你传递对象的功能。 std::ref
的整点是你不要必须给出模板参数,因为它可以被推断出来。所以,如果你想entry
参考,那么你应该只是做:
std::ref(entry)
这是一个方便的功能,节省了您不必创建std::reference_wrapper
当键入多余的类型名称。如果你做手工,你就必须做到:
std::reference_wrapper<date>(entry)
这是因为std::reference_wrapper
是一个模板类和模板类参数不能用这种方式来推断。
答
的std::ref
功能模板用来针对特定对象创建std::reference_wrapper
。这允许通过引用传递一个目的是一个函数模板即使函数模板采用由值对应的参数:
例如:
template<typename T>
void foo(T t)
{
t = 42;
}
int x = 0;
foo(std::ref(x));
std::cout << x; // Will print 42
通告,该函数foo()
上面是一个相当笨功能,和我只是为了说明的目的而写的。更多的时候,你会发现std::ref
或std::cref
结合使用与std::bind
,默认情况下会创建一个复制的参数您提供:
template<typename T>
void bar(T v1, T& v2)
// ^
// Second argument accepted by reference this time...
{
v2 = v1 + 42;
}
int x = 0;
auto f = std::bind(bar, 0, ref(x));
// ^^^
// ...but without this, a copy of x would be created!
f(x);
std::cout << x; // Will print 42
还要注意,你通常不会明确指定模板参数为std::ref
或std::cref
,但你宁愿让函数模板推断出结论。
这是'的std :: ref'? – 2013-03-21 10:47:18
@sftrabbit,我不确定。在代码中我使用'namespace std;'并且没有其他名称空间以这种方式使用。而且,在'ref'前面我没有'::',所以我假设它来自'std'名称空间。 – Roman 2013-03-21 10:49:42
@sftrabbit我问我自己同样的问题,而是'的std :: ref'不应该需要一个明确的模板参数。 – juanchopanza 2013-03-21 10:53:33