如何给类提供几个可变模板模板参数

How to give several variadic template template arguments to class

本文关键字:几个 参数      更新时间:2023-10-16

我应该如何给下面的类s提供模板模板参数?

#include "tuple"
template<
    class C1,
    template<class... C3> class C2,
    class... C3,
    template<class... C5> class C4,
    class... C5
> struct S {};
int main() {
    S<
        int,
        std::tuple<int, char>,
        std::tuple<double>
    > s;
    return 0;
}

GCC 4.8.3投诉:

expected a class template, got 'std::tuple<int, char>'

我应该使用什么来代替元组?S必须知道运算符()中的C3,但我不能在那里给出C3,因为boost::mpl::for_each需要运算符()的特定签名。以前我通过将tuple<int, char>()作为一个正则参数来推导模板来处理这个问题,但在这里这似乎不可能。类似的问题已在https://stackoverflow.com/a/12782697/1226313但这似乎只适用于函数而不适用于类。为了清楚起见,在S的运算符()内部,我想将C3(以及C5、C7等)作为变元函数的参数传递。

您需要提供一个模板,而不是类型:

S<int, std::tuple, /* std::tuple */> s;

模板参数与模板参数不匹配。如果这是主要模板:

template<
    class C1,
    template<class...> class C2,  // note 1
    class... C3,
    template<class...> class C4,  // note 1
    class... C5
> struct S {};

// note 1:我删除了模板模板参数参数包C3C5的名称,因为它们没有任何用途

然后你会实例化这样的模板:

S<
    int,
    std::tuple,
    int, char,
    std::tuple,
    double
>

但以上方法不起作用,因为任何参数包都必须位于主模板声明中参数列表的末尾。

如果你想实例化这样的模板:

S<
    int,
    std::tuple<int, char>,
    std::tuple<double>
>

然后您需要意识到std::tuple<int,char>std::tuple<double>不是模板。它们是根据模板生成的类。以下主模板将匹配这些参数:

template<
    class C1,
    class C2,
    class C3
> struct S;

如果你想了解元组中的类型,有很多方法可以做到这一点。以下方式可能不是最好的,但它最接近你最初的要求。您可以在主模板后添加部分专业化,当C2C3std::tuple:的专业化时使用

// Partial specialisation
template<
    class C1,
    class... C3,
    class... C5
> struct S<
    C1,
    std::tuple<C3...>,
    std::tuple<C5...>
> {
    auto operator()() const {
        // do something with C1,C3...,C5... here
    }
};