如何将tuple转换为初始化列表?C++用tuple替代参数包实现方法
实现方案
C++17及以上版本(最简实现)
直接用标准库提供的std::apply工具就能把tuple元素拆包为参数包,匹配你原有的参数包展开逻辑:
#include <tuple> #include <QCborArray> template <class Tuple> QCborArray array_from_tuple(const Tuple& t) { return std::apply([](const auto&... args) -> QCborArray { return {args...}; }, t); }
std::apply会自动将传入tuple的所有元素按顺序提取,作为参数传入后面的Lambda函数,完全等价于你原来直接调用array(args...)的效果。
C++11/14兼容实现
如果你的编译环境不支持C17,需要自己实现索引序列工具来完成tuple展开:
首先补充C11版本的索引序列实现(C++14及以上可以跳过这段,直接使用std::index_sequence和std::make_index_sequence):
template <size_t... Is> struct index_sequence {}; template <size_t N, size_t... Is> struct make_index_sequence_impl : make_index_sequence_impl<N-1, N-1, Is...> {}; template <size_t... Is> struct make_index_sequence_impl<0, Is...> { using type = index_sequence<Is...>; }; template <size_t N> using make_index_sequence = typename make_index_sequence_impl<N>::type;
再实现tuple展开的逻辑:
template <class Tuple, size_t... Is> QCborArray array_from_tuple_impl(const Tuple& t, index_sequence<Is...>) { return {std::get<Is>(t)...}; } template <class Tuple> QCborArray array_from_tuple(const Tuple& t) { return array_from_tuple_impl(t, make_index_sequence<std::tuple_size<Tuple>::value>{}); }
调用示例
不管用哪个版本的实现,调用方式完全一致,直接传入你用std::make_tuple生成的tuple即可:
auto my_tuple = std::make_tuple(1, "test string", 3.1415, false); QCborArray result = array_from_tuple(my_tuple); // 等价于原函数调用 array(1, "test string", 3.1415, false)
注意事项
- 实现支持任意大小的std::tuple,也兼容std::pair等符合tuple协议的类型
- 需确保tuple内所有元素的类型都可以被QCborArray的构造函数接受,否则会触发编译错误
内容的提问来源于stack exchange,提问作者LightSith
相关产品推荐
相关产品推荐

