扩展模板<class> classes </class>的参数包

时间:2014-10-22 13:16:46

标签: c++ templates c++11 variadic-templates template-templates

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

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...>;

这给了我一个错误“参数包没有扩展为'...'

有人知道正确的synax吗?

从下面的评论中,它在clang中编译,我通过Cygwin使用gcc 4.8.2。

1 个答案:

答案 0 :(得分: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...>;