gpt4 book ai didi

c++ - 将元组类型转换为另一个元组类型

转载 作者:行者123 更新时间:2023-12-01 15:13:19 24 4
gpt4 key购买 nike

假设我有一个元组类型std::tuple<x,y,z>,或者也许是std::tuple<a,b>。我想要一种通用的方式来转换我的元组中的类型,例如“功能化”以获得

std::tuple<std::function<void(x)>,
std::function<void(y)>,
std::function<void(z)>>

或为诸如以下的shared_pointers获取存储空间
std::tuple<std::shared_pointer<a>,
std::shared_pointer<b>>

我将如何使用C++ 17实现这一目标? C++ 20回答很有趣,但不适用于我目前的情况。

动机:
我有一个要通过任意(不一定是唯一)类型列表进行参数化的类,并且希望为列表中的每种类型都拥有一个std::function成员。

最佳答案

模板特化可能是最简单的方法。

template <typename T>
struct functionize;

template <typename... Ts>
struct functionize<std::tuple<Ts...>> {
using type = std::tuple<std::function<void(Ts)>...>;
}

using MyTuple = std::tuple<int, double, char>;
using MyTupleFunctionized = typename functionize<MyTuple>::type;

为了使其更通用,您可以接受模板template参数以应用于包。
template <typename Tuple, template <typename> typename Component>
struct transform_tuple;

template <typename... Ts, template <typename> typename Component>
struct transform_tuple<std::tuple<Ts...>, Component> {
using type = std::tuple<Component<Ts>...>;
}

using MyTuple = std::tuple<int, double, char>;
using MyTransformedTuple = typename transform_tuple<MyTuple, std::shared_ptr>::type;

更通用的解决方案最适合 c++17或更高版本。在此之前,它将仅在参数恰好为1的模板上匹配。在 c++17之后,它也可以匹配类似于 std::vector的东西,它具有2个模板参数,其中第二个具有默认参数。

编辑:
正如@ Jarod42和@Caleth的评论中指出的那样,我们可以对此进行更多改进。
template <typename Tuple, template <typename...> typename Component>
struct transform_tuple;

模板模板参数的参数包允许我们从 std::vector中传递诸如 c++11的内容并向前传递。仅当我们要传递混合了类型和非类型参数的内容(如 std::array)时,才会出现问题。

我们可以使用模板别名部分解决该问题。
template <typename T>
using FixedArray10 = std::array<T, 10>;

using MyTransformedTuple = typename transform_tuple<MyTuple, FixedArray10>::type;

关于c++ - 将元组类型转换为另一个元组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61112088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com