【发布时间】:2015-05-21 02:13:03
【问题描述】:
我正在尝试制作一个按顺序读取元素的可变参数模板函数(带有索引)。例如,目标是调用函数 read_tuple 来读取两个 id 为 0 和 1 的整数(使用 read_int(0) 和 read_int(1))。
这是我目前得到的代码:
int data[] = {10,20,30,40};
int int_read(int id)
{
return data[id];
}
template <typename T>
T read(int& index)
{
index--;
int value = int_read(index);
std::cout << "index :" << index << " value: " << value << std::endl;
return value;
}
template <typename... Args>
std::tuple<Args...> read_tuple()
{
int index = sizeof...(Args);
return std::tuple<Args...>(read<Args>(index)...);
}
我可以这样称呼它:
auto tuple = read_tuple<int, int>();
std::cout << "First: " << std::get<0>(tuple) << std::endl;
我得到以下输出:
index :1 value: 20
index :0 value: 10
First: 10
但是,此代码取决于读取函数的求值顺序。如何生成依赖于包扩展的索引(以避免未定义的行为)?
【问题讨论】:
-
通过使用花括号初始化列表
std::tuple<Args...>{read<Args>(index)...},您可以保证按照出现的顺序(即从左到右)执行
标签: c++ c++11 variadic-templates