如何在 C++ 中构造具有匹配数据类型的两对中的四个元素的元组?
How to construct a tuple with four elements from two pairs with matching data types in C++?
我有一个函数 f()
,它 return 是一个 std::pair<A, B>
,具有某些类型 A
和 B
。我还有另一个函数 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());
}
我有一个函数 f()
,它 return 是一个 std::pair<A, B>
,具有某些类型 A
和 B
。我还有另一个函数 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 asstd::array
andstd::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());
}