嗯,这就是我想要实现的目标。我有这样的结构:
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,T3
,5,6,7
(或传递给specialize s
和r
的任何其他模板参数) 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
{
//
}
但不幸的是,这会产生编译错误。
如何实现这一目标?
答案 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...>>{
};