12

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

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。

4

1 回答 1

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...>;
于 2014-10-23T10:41:38.283 回答