是否可以在另一个模板参数的模板参数中声明模板参数?

Qua*_*ock 3 c++ arrays templates c++20

我正在尝试创建一个以 anstd::array作为模板参数的类模板。目前,声明如下:

template<typename T, std::size_t N, std::array<std::size_t, N> A>
class Foo {
    ...
}
Run Code Online (Sandbox Code Playgroud)

然而,这是非常不幸的,因为我通常会A使用初始值设定项列表进行初始化,这使得需要指定N繁琐且多余的操作:

// Current
Foo<int, 3, {5, 3, 4}> bar;

// Preferred
Foo<int, {5, 3, 4}> baz;
Run Code Online (Sandbox Code Playgroud)

我尝试过使用类似于模板模板参数的东西但无济于事:

template<typename T, template<std::size_t N> std::array<std::size_t, N> A>
Run Code Online (Sandbox Code Playgroud)

有没有办法完成我想要做的事情,或者N通过将其放在A参数列表中的后面来“隐藏”?

Ami*_*rsh 5

可以选择添加包装器,因此以下代码可以工作:

Foo2<as_std_array<5, 3, 4>> baz2;
Run Code Online (Sandbox Code Playgroud)

as_std_array定义为:

template<auto item, auto... items>
struct as_std_array {
    using TYPE = std::common_type_t<decltype(item), decltype(items)...>;
    constexpr static std::size_t SIZE = sizeof...(items)+1;
    constexpr static auto ARRAY = std::array<TYPE, SIZE>{item, items...};
};
Run Code Online (Sandbox Code Playgroud)

Foo Foo2为:

template<std::size_t N, typename T, std::array<T, N> A>
struct Foo {
    constexpr static auto ARRAY = A;
};

template<typename T>
class Foo2: public Foo<T::SIZE, typename T::TYPE, T::ARRAY>{};
Run Code Online (Sandbox Code Playgroud)

然后进行以下工作:

Foo2<as_std_array<5, 3, 4>> baz2;    
static_assert(baz2.ARRAY == std::array{5, 3, 4});
Run Code Online (Sandbox Code Playgroud)

链接到代码