Подтвердить что ты не робот

Расширение пакета параметров классов шаблона <class>

Предположим, что у меня есть некоторые классы шаблонов, определенные следующим образом:

template<template<class>class...>
struct my_class;

template<class>
struct define_template{
    template<class>
    class type;
};

Мне нужно определить шаблон псевдонима, который заменяет define_template:: type в my_class поэтому для трех классов я мог бы это сделать

template<class A, class B, class C>
using my_alias = my_class<  define_template<A>::template type, 
                            define_template<B>::template type, 
                            define_template<C>::template type>;

Я не могу выработать синтаксис, чтобы сделать это для вариативного шаблона в идеале, что-то вроде этого

template<class... T>
using new_class = my_class<define_template<T>::template type...>;

который дает мне ошибку "пакеты параметров, не расширенные с помощью"..."

Кто-нибудь знает правильную синаксию?

Из комментариев ниже он компилируется в clang, я использую gcc 4.8.2 через Cygwin.

4b9b3361

Ответ 1

Я предполагаю, что это ошибка в gcc, поэтому я сделал обходной путь на данный момент

// partially specializes a template
template<template<class, class>class TT, class T>
struct TemplateBind{
    template<class S>
    using type = TT<T, S>;
};


// the workaround
template<template<template<class>class...>class A,
         template<class, class>class B,
         template<class>class... C>
class workaround {
    template<class D, class... E>
    static auto get_type(D, E...)
    -> typename workaround<A, B, C..., TemplateBind<B, D>::template type>::template type<E...>;

    static auto get_type()
    ->A<C...>;

public:
    template<class... T>
    using type = decltype(get_type(std::declval<T>()...));

};

// convinience alias
template<template<template<class>class...>class OriginalTemplate,
         template<class, class>class Substitution,
         class... Types>
using InstatiateVariadicTemplateTemplate = typename workaround<OriginalTemplate, Substitution>::template type<Types...>;

Затем мы можем определить оболочку для define_template

// wrapper alias gets  define_template in the right form
template<class A, class B>
using my_wrapper = typename define_template<A>::template type<B>;

и выполните следующие действия

template<class... T>
using my_alias = InstatiateVariadicTemplateTemplate<my_class, my_wrapper, T...>;