我有一个看起来像这样的函数
template <typename... Rets, typename... Args>
std::tuple<Rets...> call_nn(std::string_view query, Args... args)
{
pqxx::work w(con_);
pqxx::row res = w.exec_params1(pqxx::zview(query), args...);
w.commit();
return // std::tuple<Rets...>((res[std::index_sequence_for<Rets>{}].as<Rets>())...); don't work
}
pqxx::row
代表 postgres 结果表的一行。它支持获取列值作为res[0].as<int>()
。
问题是我不知道如何扩展可变参数模板参数来访问类型索引和类型本身。我应该放什么来代替
???
?
return std::tuple(ret[/*???*/].as<Rets>()...);
我尝试定义
int i = 0
并像 res[i++].as<Rets>()...
一样展开,但编译器给出警告
Multiple unsequenced modifications to 'i'
所以也许有一些更好的方法可以将 return 语句扩展到下面的示例,而无需运行时变量
return std::tuple(ret[0].as<X>(), ret[1].as<Y>(), /*...*/ ret[n].as<Z>() );
您想要为
index_sequence
中的值创建第二个参数包:
template <typename... Rets, std::size_t... Idxs, typename... Args>
std::tuple<Rets...> call_nn(std::index_sequence<Idxs...>, std::string_view query, Args&... args)
{
pqxx::work w(con_);
pqxx::row res = w.exec_params1(pqxx::zview(query), args...);
w.commit();
return std::tuple<Rets...>((res[Idxs].as<Rets>())...);
}
template <typename... Rets, typename... Args>
std::tuple<Rets...> call_nn(std::string_view query, Args... args)
{
return call_nn<Rets...>(std::index_sequence_for<Rets...>{}, query, args...);
}