Я ищу способ удалить (пусть теперь все вхождения) тип из пакета параметров шаблона. Конечным результатом будет структура, которая выглядит так:
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;
};
// --------------------------------------------------------------
Теперь я даже не могу начать тестировать этот код, потому что структура pack недействительна С++
Повторение
На всякий случай это полезно для ответа, некоторые другие проблемы при его решении
- Можно утверждать, что
packвообще не полезен. Вместо этого мы могли бы перемещаться вокруг структурыRemoveT, создавая новыйRemoveT, который содержит только те типы, которые необходимы. Затем проблема преобразуется при извлечении типов из структуры - Мы могли бы создать пары типов, которые имитируют поведение typelists и используют для этого более рекурсивный подход.
Нижняя линия
Для переменных типов Ts и типа T: Могу ли я создать Us из Ts ommiting T?