捕获可变参数模板类型?

时间:2014-05-22 17:53:48

标签: c++ templates c++11 variadic-templates

例如,我有一个代码如下

template<class... Ts>
void f(Ts... args)
{
}

传递以下参数时

int j = 5;
int& i = j;
f(i);

void g(int& i)
{
    f(i);
}

捕获的类型不是int&amp;在上述两种情况下。如何让它捕获int&amp;,与i相同的类型?感谢。

1 个答案:

答案 0 :(得分:4)

类型模板参数演绎条带cv-qualifiers和ref-qualifers(它还将数组类型转换为指针类型,函数类型转换为函数指针类型。)

如果您希望引用成为推导类型的一部分,请将其添加到声明符中。 (同样适用于const。)

template<class... Ts>
void f(Ts&... args);

如果您希望推导的类型是左值引用或右值引用,具体取决于参数是左值还是右值,请使用“通用引用”。

template<class... Ts>
void f(Ts&&... args);

(尽管后者看起来如此,它意味着“仅接受rvalue”。这种情况非常罕见。对于这种情况,请参阅How to make template rvalue reference parameter ONLY bind to rvalue reference?

注意:只有当传入的变量被声明为引用时,才有 no 方法来创建一个仅通过引用获取其参数的函数。这是因为引用的行为与其引用的对象完全相同(除非应用decltype时)。