扩展模板类的参数包<class>

Expanding a parameter pack of template<class>classes

本文关键字:lt class gt 参数 扩展      更新时间:2023-10-16

假设我有一些模板类定义如下

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编译的,我通过Cygwin使用gcc 4.8.2。

我假设这是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...>;