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

Я хочу определить, является ли какой-либо шаблон вариативного класса базой для другого класса. Обычно я бы использовал 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>
{};

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


person Brett Rossier    schedule 20.05.2011    source источник


Ответы (2)


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>
{};

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

person Johannes Schaub - litb    schedule 20.05.2011
comment
Не уверен, что это что-то меняет, но я немного отредактировал VarTemplClassB<int, int, string>, теперь это просто VarTemplClassB. - person Brett Rossier; 21.05.2011
comment
@Johannes: Бу, несколько секунд! :( - person Xeo; 21.05.2011
comment
Лол, не знаю, сколько перестановок я пробовал и не нашел на этой. Прекрасно работает. Спасибо! - person Brett Rossier; 21.05.2011
comment
@pheedbaq: Через некоторое время вы просто попадете в тот шаблон, который предлагает частичная специализация. :) - person Xeo; 21.05.2011
comment
@Xeo ох, это была действительно небольшая разница во времени! - person Johannes Schaub - litb; 21.05.2011
comment
@litb & Xeo: У кого-нибудь из вас есть лучшее название для этого поста? Я часто задаюсь вопросом, сколько существует дубликатов подобных вопросов только потому, что мне так сложно описать свой вопрос. - person Brett Rossier; 21.05.2011

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

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 >
{};
person Xeo    schedule 20.05.2011
comment
Что ж, я попробовал несколько вещей. По-прежнему не очень хорошо разбираюсь в том, как нарезать вещи по специализациям, но я добираюсь до цели. ТАКИЕ взгляды были огромным подспорьем! - person Brett Rossier; 21.05.2011
comment
@pheedbaq: Fighto! ;) Но я должен признать, что эта частичная специализация - часть TMP, которая мне очень нравится, особенно возможность сопоставления с образцом, которую она позволяет. - person Xeo; 21.05.2011
comment
То же самое. Я всегда впечатлен тем, что умеет TMP, несмотря на какой-то уродливый синтаксис. Сам факт, что эти вещи могут быть реализованы в первую очередь, наряду со всем остальным, что делает язык ... довольно круто. - person Brett Rossier; 21.05.2011