2

在我试图理解的代码中,我看到了这样的结构:ref<date>(entry). 请任何人解释一下它的含义。

我假设我们创建了对entry对象的引用,但date类型是如何使用的。例如ref<date>(entry)andref<location>(entry)将返回不同的值。它是如何工作的?

4

2 回答 2

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是模板类,模板类参数不能这样推导出来。

于 2013-03-21T10:55:08.550 回答
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::refstd::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::refor显式指定模板参数std::cref,而是让函数模板推导出它。

于 2013-03-21T10:55:27.730 回答