在我试图理解的代码中,我看到这样的结构:ref<date>(entry)
。请任何人解释它的意思。
我假设我们创建了对entry
对象的引用,但是如何使用date
类型。例如,ref<date>(entry)
和ref<location>(entry)
将返回不同的值。它是如何工作的?
答案 0 :(得分:3)
如果您有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
是一个模板类,并且不能以这种方式推导出模板类参数。
答案 1 :(得分:2)
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
明确指定模板参数,而是让函数模板推导出它。