【发布时间】:2013-12-28 16:28:51
【问题描述】:
我有一个看起来像这样的重载函数:
template<typename T>
T getColumn(size_t i);
template<>
std::string getColumn<std::string>(size_t i) {
if(i == 0)
return "first";
else
return "other";
}
template<>
int getColumn<int>(size_t i) {
return i*10;
}
// ...
现在我要实现这个功能
template<typename... Values>
std::tuple<Values...> getColumns();
它创建一个元组(用于返回值)并为元组的每个元素调用getColumn(将返回值保存在该元素中),其中i 是元素的位置。生成getColumn 的返回值的代码被简化(实际上它是从数据库中获取值)。
但我不知道该怎么做。
我最好的尝试是使用 boost::fusion::for_each,但我无法将 i 交给 getColumn。
另一个尝试是使用 boost::fusion 中的迭代器,但这也没有用:
namespace fusion = boost::fusion;
tuple<Values...> t;
auto it = fusion::begin(t);
while(it != fusion::end(t)) {
getColumn(distance(fusion::begin(t), it), fusion::deref(it));
it = fusion::next(it); // error: assignment not allowed
}
如何使用i 的正确值为Values... 中的每个类型调用getColumn,并将结果保存在std::tuple 中?
【问题讨论】:
标签: c++ tuples variadic-templates boost-fusion