gpt4 book ai didi

c++ - 如何从模板参数包中删除类型?

转载 作者:可可西里 更新时间:2023-11-01 15:00:51 29 4
gpt4 key购买 nike

我正在寻找一种方法来从模板参数包中删除(假设现在所有出现的)类型。最终结果将是一个看起来像这样的结构:

template<typename T, typename...Ts>
struct RemoveT
{
using type = /* a new type out of Ts that does not contain T */
}

假设边际情况RemoveT<int, int>将通过返回 void 来处理(不在后面的代码中处理)。我的初始设计如下:

// --------------------------------------------------------------
// 1. A "way" of typedefing variadic number of types ------------
template<typename...Ts>
struct pack {
using type = Ts;
};
// --------------------------------------------------------------

// --------------------------------------------------------------
template<typename T, typename...Ts> struct RemoveT;

template<typename T, typename T1, typename...Ts>
struct RemoveT {
using type = typename pack<T1, typename RemoveT<T, Ts...>::type>::type;
};

template<typename T, typename T1>
struct RemoveT<T, T1> {
using type = T1;
};

template<typename T, typename...Ts>
struct RemoveT<T, T, Ts...> {
using type = typename RemoveT<Ts...>::type;
};
// --------------------------------------------------------------

现在我什至不能开始测试这段代码因为the pack structure is not valid C++

重申

以防万一这对答案有帮助,解决它的一些其他想法

  • 有人可能会争辩说 pack甚至根本没有用。我们可以绕着 RemoveT 移动结构,创建一个新的RemoveT只包含所需的类型。然后问题转变为从结构中提取类型
  • 我们可以创建模仿类型列表行为的类型对,并对此采取更递归的方法。

底线

对于可变类型 Ts和一个类型 T : 我可以创建 Us来自 Ts省略 T ?

最佳答案

下面提供了一种非递归和直接的方法来删除T来自 Ts...并且,像 Jarod42 的解决方案一样,产生一个 std::tuple<Us...>但无需使用 typename ...::type :

#include <tuple>
#include <type_traits>

template<typename...Ts>
using tuple_cat_t = decltype(std::tuple_cat(std::declval<Ts>()...));

template<typename T, typename...Ts>
using remove_t = tuple_cat_t<
typename std::conditional<
std::is_same<T, Ts>::value,
std::tuple<>,
std::tuple<Ts>
>::type...
>;


int main()
{
static_assert(std::is_same<
remove_t<int, int, char, int, float, int>,
std::tuple<char, float>
>::value, "Oops");
}

Live example

关于c++ - 如何从模板参数包中删除类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23855712/

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