C++0x : how to get variadic template parameters without reference?

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

给出以下人为的(是的,很糟糕的)示例:

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,但会接受一个尚未在此编译器中实现的答案。

最佳答案

我不明白你的问题。这段代码在 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,移除引用并将数组和函数类型分别转换为元素和函数指针。这就是您要寻找的东西。

关于C++0x : how to get variadic template parameters without reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5125408/

相关文章:

c++ - 无法将对象上的指针添加到集合

c++ - 访问前 n 个可变函数参数

c++ - 确保模板化泛型参数的返回类型

c++ - 从模板类覆盖纯虚函数

c++ - 使用 noexcept C++11 正确实现函数

c++程序不会在void()函数中退出循环

c++ - 如何使用 `std::error_category` 和 system_error header 中的其他内容?

c++ - Protobuf、CodedInputStream 解析部分消息

c++ - 我可以检查初始化列表中设置的构造函数主体中的变量吗?

c++ - 内联函数 C++ 的 undefined reference