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

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

概述我正在寻找一种从模板参数包中删除(让我们说现在所有的发生)一种类型的方法.最终结果将是一个看起来像这样的结构: template<typename T, typename...Ts>struct RemoveT{ using type = /* a new type out of Ts that does not contain T */} 让我们说边缘案例RemoveT< int, 我正在寻找一种从模板参数包中删除(让我们说现在所有的发生)一种类型的方法.最终结果将是一个看起来像这样的结构:
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 – 如何从模板参数包中删除类型?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249524.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存