Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Извлечь пакет параметров вариативного шаблона и использовать его в другом вариационном шаблоне в мета-функции свойств типа?

Автор вопроса: Brett RossierОтветов: 2

Я хочу определить, является ли какой-либо шаблон вариативного класса базой для другого класса. Обычно я бы использовал std :: is_base_of, но я не думаю, что мой вариант использования подходит, и я не уверен, что в std или boost уже есть что-то, чтобы справиться с этим. Я хочу, чтобы пакет параметров шаблона вариативного базового класса происходил из другого шаблона вариативного класса. Вот пример кода, который, надеюсь, объясняет, что я хочу сделать:

Использование:

is_variadic_base_of<
   VarClassTemplA
   , ClassDerivedFromA
   , VarClassTemplB //Has param pack I want to use with ClassA
>::value;

Кишки:

//test for variadic base of non-variadic
template <template<typename...> class A, typename B, typename... ArgsC>
struct is_variadic_base_of
: std::is_base_of<A<ArgsC...>, B>
{};

Это возможно?

c++templatesc++11template-meta-programmingtypetraits

Ответы

Ответ 1 · рейтинг 6 · Johannes Schaub - litb

template <template<typename...> class A, typename B, typename ArgsC>
struct is_variadic_base_of;

template <template<typename...> class A, typename B,
          template<typename...> class C, typename ...ArgsC>
struct is_variadic_base_of<A, B, C<ArgsC...>>
: std::is_base_of<A<ArgsC...>, B>
{};

Надеюсь, это поможет!

Ответ 2 · рейтинг 4 · Xeo

Вы почти у цели, но попробуйте с частичной специализацией:

template<
    template<class...> class A, class B, class C
>
struct is_variadic_base_of;

// partial spec
template<
    template<class...> class A, class B,
    template<class...> class C, class... ArgsC
>
struct is_variadic_base_of< A,B,C<ArgsC...> >
  : std::is_base_of< A<ArgsC...>,B >
{};

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы