4

鉴于以下人为的(是的,可怕的)示例:

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

如果你这样称呼它,它会起作用:

int x = 10;
something<int>(x);

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

int x = 10;
something<int&>(x);

由于分配给 5。假设无论出于何种原因,我不能在定义元组时对其进行初始化,那么在将类型指定为引用时,我该如何让它工作?

具体来说,我希望元组是std::tuple<int>even when Args...is int&

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

我正在使用 gcc 4.5.2,但会接受此编译器中尚未实现的答案。

4

2 回答 2

12

我不明白你的问题。这段代码在 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]$

我不知道“初始化模板”是什么意思。


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

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

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

于 2011-02-26T06:56:09.580 回答
5

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

于 2011-02-26T07:44:48.733 回答