模板类型的引用是什么意思?

时间:2013-03-21 10:46:23

标签: c++ templates types std

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

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

2 个答案:

答案 0 :(得分:3)

如果您有using namespace std;且包含<functional>标头,则表示std::ref功能。

std::ref是一个函数,它将创建一个包裹您传递的对象的std::reference_wrapperstd::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::refstd::crefstd::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::refstd::cref明确指定模板参数,而是让函数模板推导出它。