gpt4 book ai didi

c++ - 两个元组的编译时集减法

转载 作者:行者123 更新时间:2023-12-04 01:03:25 29 4
gpt4 key购买 nike

我有一个应用程序,我在其中从参数包构造元组:

template<class... T>
struct foo {
typedef std::tuple<T...> A;
}

我还有另一个元组类型 B 定义为:

typedef std::tuple<char, int> B;

有没有办法获得一个新的元组C,这样C 是集合AB编译时

A = {int, double, float, bool}
B = {char, int}
C = A - B = {double, float, bool} // answer

完整问题的更多上下文:

template<class... T>
struct foo {
using first_type = typename std::tuple_element<0, // n'th type
std::tuple<T...>>::type;
}

我可以通过上面的操作找到第 0 种类型,但我对上面集合 B 中不包含的第一种类型感兴趣。因此,有点像编译时搜索以查找第一个有效类型。

最佳答案

这是一个编译时集减法,将其用作set_diff<tuple1, tuple2>::type :

template <class...> class set_diff;

template <class... A, class... B>
struct set_diff<std::tuple<A...>, std::tuple<B...>>
{
template <class J, class... Js>
constexpr static bool exists_in = std::disjunction_v<std::is_same<J, Js>...>;

using type = decltype(tuple_cat(std::declval<
std::conditional_t<exists_in<A, B...>, std::tuple<>, std::tuple<A>>>()...));
};

Demo

注意:

  • 操作数的顺序很重要(根据问题描述)
  • 有多种可能的编译复杂性“优化”(例如,在 diff 之前对类型进行排序和删除重复项等)。

我的解决方案分为两步:

  1. 将“不需要的”类型标记为 tuple<>
  2. 生成所需的 type使用 tuple_cat , 驱逐空元组

可以在此处找到更不言自明(可惜更冗长)的演示<知识库> Demo

关于c++ - 两个元组的编译时集减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67347545/

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