【问题标题】:Templated class whose argument must be another templated class参数必须是另一个模板类的模板类
【发布时间】:2015-12-09 16:57:24
【问题描述】:

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

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;

并且我希望能够在q 的定义中访问T1,T2,T3、5,6,7(或传递给专门化s 和r 的任何其他模板参数)。

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

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
{
    //
}

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

如何做到这一点?

【问题讨论】:

  • r 将不得不发布Ts...。否则这是一个非推断的上下文。

标签: c++ templates nested


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 2012-04-22
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多