c++ - 如何在C++中使用匹配数据类型的两对中的四个元素构造一个元组?

Kai*_*zke 6 c++ stdtuple std-pair

我有一个函数f(),它返回std::pair<A, B>具有某些类型AB. 我还有另一个函数g(),它调用f()两次并返回一个std::tuple<A, B, A, B>. 有没有办法tuple直接从两个调用构造返回f()?所以我想将当前代码的最后三行作为快捷方式:

std::tuple<A, B, A, B>
g(type1 arg1, type2 arg2, ...) {
    // perform some preprocessing
    auto pair1 = f(...);
    auto pair2 = f(...);
    return { pair1.first, pair1.second, pair2.first, pair2.second }
}
Run Code Online (Sandbox Code Playgroud)

成一个班轮(而不是三个)。如果该解决方案也适用于任意长度的元组,那就太好了,尤其是在模板情况下。

例如,在当前的 Python3 中,解决方案是return (*f(...), *f(...)). C++ 中是否有与 Python 中类似的列表/元组解包运算符?

Hol*_*Cat 7

是的,有std::tuple_cat。即使 cppreference 说...

如果 [arguments] 中的任何类型不是 的特化,则行为未定义std::tuple。但是,实现可以选择支持遵循类似元组协议的类型(例如std::arraystd::pair)。

我已经对其进行了测试,并且所有主要的标准库实现(libstdc++、libc++ 和 MSVC 的库)都支持它。

例子:

#include <tuple>

struct A {};
struct B {};

std::pair<A, B> foo() {return {};}

std::tuple<A, B, A, B> bar()
{
    return std::tuple_cat(foo(), foo());
}
Run Code Online (Sandbox Code Playgroud)