gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:43:26 25 4
gpt4 key购买 nike

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

template<typename T, std::size_t N, std::array<std::size_t, N> A>
class Foo {
...
}

然而,这很不幸,因为我通常会使用初始化列表来初始化 A,这使得指定 N 的需要变得乏味且多余:

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

// Preferred
Foo<int, {5, 3, 4}> baz;

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

template<typename T, template<std::size_t N> std::array<std::size_t, N> A>

有没有办法完成我正在尝试做的事情,或者通过将它放在参数列表中的 A 之后“隐藏”N

最佳答案

可以选择添加包装器,所以下面的代码可以工作:

Foo2<as_std_array<5, 3, 4>> baz2;

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

FooFoo2为:

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

然后以下工作:

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

Link to code

关于c++ - 是否可以在另一个模板参数的模板参数中声明模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69891036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com