假设我有一些模板类定义如下
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。
答案 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...>;