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

我正在寻找一种从模板参数包中删除(让我们说现在所有的发生)一种类型的方法.最终结果将是一个看起来像这样的结构:
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++

重述

为了防止这样做有助于解决问题

人们可以认为,这个包根本就没有用处.我们可以绕过RemoveT结构,创建一个只包含所需类型的新的RemoveT.然后,在从结构体中提取类型时,该问题将转换
>我们可以创建类型对,模仿类型列表的行为,并采取更递归的方法.

底线

对于各种类型的Ts和一个类型T:我可以创建我们的Ts ommit T吗?

解决方法

以下提供了一种非递归和直接的方法来从Ts …删除T,并且像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,float,int>,std::tuple<char,float>
    >::value,"Oops");
}

Live example

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...