C++如何从两个类型匹配的std::pair构造含四元素的std::tuple
解决方案
C++ 没有和 Python 完全一致的通用*元组解包运算符,但针对你需要拼接多个pair/tuple返回值构造目标tuple的场景,从C++11开始就有非常简洁的实现方式,完全可以1行写完,且支持模板场景、适配任意长度的pair/tuple拼接。
最简方案:使用std::tuple_cat
std::tuple_cat是标准库提供的变参模板函数,可以将任意数量的std::pair、std::tuple拼接为一个新的tuple,你的需求可以直接写成:
std::tuple<A, B, A, B> g(type1 arg1, type2 arg2, ...) { // perform some preprocessing return std::tuple_cat(f(...), f(...)); }
方案优势
- 完全符合你的需求:两行局部变量+return直接简化为1行return
- 通用性极强:不管
f()返回的是std::pair还是任意长度的std::tuple,不管你需要拼接多少个f()的返回值,都可以直接传入std::tuple_cat,返回值类型会自动推导 - 原生支持模板场景:不需要手动写返回类型,模板场景下可以直接用
auto推导返回类型:
// 模板场景示例 template<typename... Args> auto g(Args&&... args) { // 预处理逻辑 return std::tuple_cat( f(std::forward<Args>(args)...), f(std::forward<Args>(args)...) // 需要拼接更多返回值直接往后加即可 ); }
其他场景的解包方案
如果你需要的不是拼接tuple,而是把pair/tuple的元素解包为函数参数、或者用于聚合初始化,标准库也有对应实现:
- C++17及以上可用
std::apply,将tuple的元素展开作为函数的入参 - C++23进一步支持了更通用的范围解包语法,可以在函数参数列表、聚合初始化等场景直接解包tuple/pair,适用场景和Python的
*解包基本一致。
内容的提问来源于stack exchange,提问作者Kai Petzke
相关产品推荐
相关产品推荐

