gpt4 book ai didi

C++ 在可变参数模板的参数包中获取参数的并集?

转载 作者:行者123 更新时间:2023-11-28 04:01:50 26 4
gpt4 key购买 nike

我一直在用 C++ 编写一些涉及大量元编程的代码;该代码对一个任务建模,该任务在运行时由一系列节点定义,这些节点接受大量输入,并在运行时产生一定数量的输出。输入和输出在有向图中链接。我将有限数量的节点类型存储在一个变体中,并且每个节点类都定义了一个静态 constexpr 变量,该变量或多或少地列出了该节点的输入和输出类型。我希望能够获取节点类列表并将其转换为节点所作用的数据类列表。

更明确地说,如果我有一个像这样在编译时纯粹跟踪一些类列表的模板:

template<class... Args>
struct ClassList{};

我想要某种可以像这样转换列表列表的模板:

ClassList<ClassList<int,int,double>, ClassList<double,char>, ClassList<char, char> >

进入内部列表的 union :

ClassList<int,double,char>

对顺序没有特殊要求 - 除了原始列表中出现的每种类型在最终列表中只出现一次 - 如果可能的话,我希望以一种不会导致我的编译器崩溃的方式来执行此操作.我知道理论上我可以编写一大堆递归模板,将列表合并为一个,然后删除重复项,但该解决方案听起来有点令人讨厌。有没有更好的办法?

最佳答案

在将类型添加到最终列表之前过滤类型的解决方案:

template<class... Ts>
struct class_list {};

template<class... Ts>
struct make_unique {
using type = class_list<Ts...>;
};

template<class... Ts>
struct make_unique<class_list<>, Ts...> : make_unique<Ts...>{};

template<class U, class... Us, class... Ts>
struct make_unique<class_list<U, Us...>, Ts...>
: std::conditional_t<
(std::is_same_v<U, Us> || ...) || (std::is_same_v<U, Ts> || ...),
make_unique<class_list<Us...>, Ts... >,
make_unique<class_list<Us...>, Ts..., U>> {};

template<class... Ts>
using make_unique_class_list = typename make_unique<Ts...>::type;

using T = make_unique_class_list<class_list<int, int, double>,
class_list<double, char>, class_list<char, char>>;
static_assert(std::is_same_v<T, class_list<int, double, char>>);

请注意,以下类似的解决方案也可以工作,但可能会太慢,因为它会实例化许多不必要的模板:

template<class U, class... Us, class... Ts>
struct make_unique<class_list<U, Us...>, Ts...>
: std::conditional<
(std::is_same_v<U, Us> || ...) || (std::is_same_v<U, Ts> || ...),
typename make_unique<class_list<Us...>, Ts... >::type,
typename make_unique<class_list<Us...>, Ts..., U>::type> {};

关于C++ 在可变参数模板的参数包中获取参数的并集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59403783/

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