填充标准::元组
Filling a std::tuple
我有一个重载函数,看起来像:
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
中?
您需要将参数包的每个元素映射到包中的索引 - 这是"索引序列技巧"的典型用例:
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)>());
}
科利鲁的现场演示。
也许有auto
:
template<typename... Values>
auto getColumns() -> decltype(std::make_tuple(getColumns<Values>()...))
{
return std::make_tuple(getColumns<Values>()...);
}
在 C++14 中,您将能够省略-> decltype...
部分,因为它将从函数体中推导出来。
相关文章:
- C++:TypeDef使用元组
- Pybind11:将元组列表从Python传递到C++
- 重载元组索引运算符-C++
- 在C++中,如何通过几种类型从元组中选择多个元素
- 将fold表达式与std::一起用于两个元组
- std::ranges::elements_view,用于自定义类似元组的数据
- 将元组的向量转换/构造为堆
- 专用于 std 元组的模板,而无需用户执行remove_cvref
- 如何从标准::元组中删除元素?
- 使用标准库在 c++11 中使用 std::tie 提取嵌套在元组中的元组
- 如何将标准::数组转换为标准::元组?
- 标准::元组成员逐个成员比较失败
- 标准::模板参数包的 std::shared_ptr元组
- 填充标准::元组
- 关联标准::元组容器
- std::元组和标准布局
- 从标准容器生成std::元组
- 漂亮的打印标准::元组
- 标准::元组内存对齐
- 这个boost::元组代码可以转换为纯std::标准库代码吗?