C++ 如何转发压缩变量参数

C++ 如何转发压缩变量参数,c++,variadic-templates,perfect-forwarding,forwarding-reference,C++,Variadic Templates,Perfect Forwarding,Forwarding Reference,我有一个函数,它接受压缩到元组中的可变参数 template <class... Args> void Bottom(tuple<Args&&...> t) { } 如果我不想改变参数1或2,哪种语法最好 编辑 我只使用tuple来展示一个打包了我的参数的类。实际的打包类在调用层次结构的不同级别上有所不同。使用使用fwd\u as\u tuple作为一种资源来查找库在这种情况下的功能是很酷的。我认为没有。我会使用std::forward\u as\u t

我有一个函数,它接受压缩到元组中的可变参数

template <class... Args>
void Bottom(tuple<Args&&...> t)
{
}
如果我不想改变参数1或2,哪种语法最好

编辑
我只使用tuple来展示一个打包了我的参数的类。实际的打包类在调用层次结构的不同级别上有所不同。使用
使用fwd\u as\u tuple
作为一种资源来查找库在这种情况下的功能是很酷的。

我认为没有。我会使用
std::forward\u as\u tuple
并让编译器进行推导:

template <class... Args>
void Top(Args&&... args) {
  Bottom(std::forward_as_tuple(args...));
}
模板
空顶(Args&…Args){
底部(std::forward_as_tuple(args…);
}
否,
元组t
不是转发引用。它们只能作为顶级参数出现

您没有添加任何内容,而是尝试匹配参数。此类函数仅接受包含r值引用的元组(按值)

例子
#包括
使用名称空间std;
模板
空底(元组t)
{
}
//在此处键入代码,或加载示例。
int main(){
双var=0.0;
元组tup1{1,var,'c'};
//#1
//底部(tup1);
元组tup2{1,0.0,'c'};
//#2
//底部(tup2);
//#3
底部(std::move(tup2));
}
  • 无法编译,因为参数无法匹配
  • 也不编译。尽管参数确实匹配,但元组本身是通过值传递的,在本例中是通过copy传递的,并且在存在r值元组成员的情况下,复制构造函数被删除
  • 移动很好,这将实例化此模板:
    模板
    空底(std::tuple t)
    {
    }
    

  • +1因为我可以看到向前的元组做了什么,并模仿它。不幸的是,我的代码中没有元组。Forward as tuple创建了一个参数引用元组(左值或右值引用)。我特别想保留
    顶部
    函数中推导的初始类型如果您提出的问题不是您想提出的问题,可能需要打开另一个问题。特别是在你得到答案后,编辑这样一句话是不好的:“哦,这个问题有答案,但我想要一个不同的答案”(我有些夸张)
    template <class... Args>
    void Top(Args&&... args) {
      Bottom(std::forward_as_tuple(args...));
    }