gpt4 book ai didi

c++ - 填充 std::tuple

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:25 24 4
gpt4 key购买 nike

我有一个重载函数,如下所示:

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
}

如何调用getColumn对于 Values... 中的每种类型i 的正确值并将结果保存在 std::tuple 中?

最佳答案

您需要将参数包的每个元素映射到它在包中的索引 - 这是“索引序列技巧”的典型用例:

template <int... I> struct index_sequence {};
template <int N, int... I>
struct make_index_sequence : make_index_sequence<N-1,N-1,I...> {};
template <int... I>
struct make_index_sequence<0, I...> : index_sequence<I...> {};

template<typename... Values, int... I>
auto getColumns(index_sequence<I...>) ->
decltype(std::make_tuple(getColumn<Values>(I)...)) {
return std::make_tuple(getColumn<Values>(I)...);
}

template<typename... Values>
auto getColumns() ->
decltype(getColumns<Values...>(make_index_sequence<sizeof...(Values)>())) {
return getColumns<Values...>(make_index_sequence<sizeof...(Values)>());
}

Live demo at Coliru.

关于c++ - 填充 std::tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20816745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com