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参数列表中的后面来“隐藏”?
可以选择添加包装器,因此以下代码可以工作:
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)
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |