C++ 0x:如何在没有引用的情况下获取可变参数模板参数?

Syd*_*ius 2 c++ templates variadic-templates c++11

鉴于以下设计(以及是,可怕)的例子:

template<typename... Args>
void something(Args... args)
{
    std::tuple<Args...> tuple; // not initializing for sake of example
    std::get<0>(tuple) = 5;
}
Run Code Online (Sandbox Code Playgroud)

如果你这样称它就可以了:

int x = 10;
something<int>(x);
Run Code Online (Sandbox Code Playgroud)

但是,如果您这样调用它,它就不起作用:

int x = 10;
something<int&>(x);
Run Code Online (Sandbox Code Playgroud)

由于赋值为5.假设我无法以任何理由在定义元组时初始化元组,在将类型指定为引用时,如何才能使其工作?

具体来说,我想元组是std::tuple<int>当即便Args...int&.

实际的用例包括将字符串反序列化为元组,其中Args...是函数的参数类型,然后通过解包元组来调用.这一切都很有效,除非函数通过引用获取参数.

我正在使用gcc 4.5.2但是会接受这个编译器中尚未实现的答案.

Joh*_*itb 9

我不明白你的问题.这段代码适用于GCC,我看不出它为什么不能工作.

#include <tuple>

template<typename... Args>
void something(Args... args)
{
  std::tuple<Args...> tuple{args...};
  std::get<0>(tuple) = 5;
}

int main() {
  int x = 10;
  something<int&>(x);
}

[js@HOST2 cpp]$ g++ -std=c++0x main1.cpp
[js@HOST2 cpp]$
Run Code Online (Sandbox Code Playgroud)

我不知道你的意思是"初始化模板".


既然您现在已经更新了问题,我可以更新我的答案

template<typename... Args>
void something(Args... args)
{
  std::tuple<typename std::decay<Args>::type...> tuple;
  std::get<0>(tuple) = 5;
}
Run Code Online (Sandbox Code Playgroud)

decay删除const/ volatile,删除引用并将数组和函数类型分别转换为元素和函数指针.这就是你似乎在寻找的东西.


Edw*_*nge 5

你试过std::tuple<std::remove_reference<Args>...>吗?