如何删除参数包中T之前的类型



出于教育目的(在阅读《现代C++设计-亚历山大库》一书时(,我想写一些助手来删除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;

这是一个演示。

相关内容

最新更新