鉴于以下设计(以及是,可怕)的例子:
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>
为Args...
,我也希望元组为int&
。
实际的用例包括将字符串反序列化为元组,其中Args...
是函数的参数类型,然后通过解包元组调用。这一切都很有效,除非函数通过引用获取参数。
我正在使用gcc 4.5.2,但会接受在此编译器中尚未实现的答案。
答案 0 :(得分: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]$
我不知道你的意思是“初始化模板”。
由于您现在已经更新了问题,我可以更新我的答案
template<typename... Args>
void something(Args... args)
{
std::tuple<typename std::decay<Args>::type...> tuple;
std::get<0>(tuple) = 5;
}
decay
删除const
/ volatile
,删除引用并将数组和函数类型分别转换为元素和函数指针。这就是你似乎在寻找的东西。
答案 1 :(得分:4)
您是否尝试过std::tuple<std::remove_reference<Args>...>
?