C++ 可变参数模板,具有类型和非类型参数混合以实现递归继承

Tib*_*ács 4 c++ templates variadic-templates

我想实现这个目标:

Foo<int, 5, double, 7> foo_1;
Foo<char, 7> foo_2;

foo_1.Foo<int>::value[4] = 1;
foo_2.Foo<char>::value[1] = 'x';
Run Code Online (Sandbox Code Playgroud)

(这是一个过于简单的例子,它的Foo作用远不止于此。)

我该如何使用可变参数模板来做到这一点?

太长了;

我知道如果使用专用类型或非类型,则可以以这种方式使用可变参数模板:

template <typename ...T>
struct Foo;

template<typename T, typename ...Args>
struct Foo<T, Args...> : Foo<T>, Foo<Args...> {
    Foo(T t, Args... args) : Foo<T>(t), Foo<Args...>(args...) { }
};

template<typename T>
struct Foo<T> {
    T value;

    Foo<T>(T v) : value(v) {}
};

Foo<int, double, char> f(7, 88.1, 'x');
f.Foo<double>::value = 5;
Run Code Online (Sandbox Code Playgroud)

但我不知道是否可以使用可变参数模板来配对和混合类型和非类型模板参数。

Hol*_*Cat 5

这是不可能的。您必须满足以下条件之一:

Foo<Bar<int, 5>, Bar<double, 7>> foo_1;
Foo<int, Bar<5>, double, Bar<7>> foo_1;
// ...?
Run Code Online (Sandbox Code Playgroud)

如果这些值始终是整数,您也可以尝试以下操作:

Foo<int[5], double[7]> foo_1;
Run Code Online (Sandbox Code Playgroud)

然后从每个参数中提取元素类型和范围。

  • 对于第一个示例,“Bar”可以是“std::array”。对于第二个,它几乎是“std::integral_constant”,除了类型必须是硬编码的。 (2认同)