模板化类,其参数必须是另一个模板化类

时间:2015-12-09 16:57:24

标签: c++ templates nested

嗯,这就是我想要实现的目标。我有这样的结构:

template<typename...Ts> struct s
{
    template<int...Is> struct r
    {
        // whatever
    };
};

现在我想写一个模板结构:

template<typename r> struct q
{
    //
};

模板应该接受struct r的特化,我希望能够访问此实例化的模板参数。

让自己更清楚:我希望能够写出这样的东西:

using some_specialisation_of_q = q< s<T1,T2,T3>::r<5,6,7> >;
some_specialisation_of_q varname;

我希望能够在定义中访问T1,T2,T35,6,7(或传递给specialize sr的任何其他模板参数) q

我的第一次尝试是这样的:

template<template<typename...Ts> template<int...Is> typename R, typename= typename std::enable_if<std::is_same<R, s<Ts...>::r<Is...>>::value>::type>
struct q
{
    //
}

但不幸的是,这会产生编译错误。

如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

首先,如果没有合作,就无法从Ts...的专业化中推断r。所以让我们发布类型:

template<typename...Ts> struct s
{
    template<int...Is> struct r
    {
        using outer_type = s;
    };
};

然后用部分专业化提取

template<class T, class = typename T::outer_type, class = T>
struct q;

template<template <int...> class R, class...Ts, int...Is>
struct q<R<Is...>, s<Ts...>, typename s<Ts...>::template r<Is...>>{
};