大佬教程收集整理的这篇文章主要介绍了如何删除参数包中 T 之前的类型?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
出于教育目的(在阅读 Modern C++ Design - A Alexandrescu 一书时),我想编写一些帮助程序来在类型 T 之前删除参数包中的所有类型。
例如,delete_until_T<C,A,B,C,D>
必须像 tuple<C,D>
一样打开或只是 <C,D>
。
据我所知,它可以用 C++17 以足够古老的递归方式和非递归方式完成。
在这段代码中,我想使用 std::conditional
以非递归方式进行操作。
//https://stackoverflow.com/a/23863962/12575933 - based on this answer
#include <tuple>
#include <type_traits>
template<typename...Ts>
using tuple_cat_t = decltype(std::tuple_cat(std::declval<Ts>()...));
template<class T,class ... Ts>
using delete_untill_T = tuple_cat_t
<
typename std::conditional
<
std::is_same_v<T,Ts>||bool_func<>,std::tuple<Ts>,std::tuple<>
>::type...
> ;
第一个问题是如何制作一个变量或函数或结构体,在这个参数包打开期间可以改变哪个值并在std::conditional
中使用?我想让 bool_func<>
在打开时在 std::is_same
返回 true 之前返回 false,然后返回 false。
如果可能的话,我的第二个问题是如何删除元组并将参数包中的参数仅传递给模板函数。
或者可能有另一种方法可以删除 T 之前的类型? (递归算法会做)。或者使用 C++ 20 特性?
实现此目的的一种方法是在可变参数中找到您要查找的类型时,使用部分特化进行匹配。
// recursive case,first 2 template parameters don't match
template<typename T,typename,typename ...Ts>
struct delete_until_impl : delete_until_impl<T,Ts...> {};
// base case,first 2 parameters match
template<typename T,typename ...Ts>
struct delete_until_impl<T,T,Ts...>
{
using type = std::tuple<T,Ts...>;
};
// convenience alias to avoid having to say typename everywhere
template<typename ...Ts>
using delete_until_T = typename delete_until_impl<Ts...>::type;
这是一个 demo。
以上是大佬教程为你收集整理的如何删除参数包中 T 之前的类型?全部内容,希望文章能够帮你解决如何删除参数包中 T 之前的类型?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。