如何在 C++ 中构造具有匹配数据类型的两对中的四个元素的元组?

How to construct a tuple with four elements from two pairs with matching data types in C++?

我有一个函数 f(),它 return 是一个 std::pair<A, B>,具有某些类型 AB。我还有另一个函数 g(),它调用 f() 两次并且 return 调用 std::tuple<A, B, A, B>。有没有一种方法可以直接从对 f() 的两次调用中构造 return tuple?所以我想缩短我当前代码的最后三行:

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 }
}

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

例如,在当前 Python3 中,解决方案将是 return (*f(...), *f(...))。 list/tuple C++ 中是否有类似 Python 的解包运算符?

是的,有std::tuple_cat。尽管 cppreference 说...

The behavior is undefined if any type in [arguments] is not a specialization of std::tuple. However, an implementation may choose to support types (such as std::array and std::pair) that follow the tuple-like protocol.

我已经对其进行了测试,所有主要的标准库实现(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());
}