非类模板中数据成员 std::array 的编译时间大小 (C++14)

dfr*_*fri 10 c++ templates stdarray c++14

编译时检查 std::array 数据成员的(编译时)大小

我需要静态地断言该类型的非constexpr数据成员的编译时大小std::array,比方说arr_,一个的非模板类是等于给定的(外部提供的)恒定。静态断言将从类内部完成,这意味着arr_可以访问,但我不能依赖任何存储的常量(也不是非类型模板参数)的大小。即,断言需要完全依赖于arr_数据成员的“一些检查” 。

如果constexpr std::array<>::size()/std::array<>::max_size()是静态成员函数(decltype(arr_)::size()/ decltype(arr_)::max_size())而不是非静态成员函数,我基本上会完成。

我有一种在成员的指向数据成员的指针上使用函数模板参数推导的工作方法arr_,但我想知道是否有更简单/更整洁的方法。

#include <array>
#include <cstddef>

// Defined/provided from elsewhere.
constexpr std::size_t kArraySize = 12U;
constexpr std::size_t kAnotherArraySize = 12U;

template <typename T, typename U, std::size_t N>
constexpr std::size_t size_of_data_member_array(std::array<T, N> U::*) {
    return N;
}

class Foo {
    std::array<int, kArraySize> arr_;
    static_assert(size_of_data_member_array(&Foo::arr_) == kAnotherArraySize, "");
};

int main() {}
Run Code Online (Sandbox Code Playgroud)

L. *_* F. 9

该标准提供了array::size以下名称的静态版本tuple_size

#include <array>
#include <tuple> // for std::tuple_size_v

static_assert(std::tuple_size<decltype(arr_)>::value == kAnotherArraySize, "");
static_assert(std::tuple_size_v<decltype(arr_)> == kAnotherArraySize); // C++17
Run Code Online (Sandbox Code Playgroud)


Gio*_*ani 5

您可以Foo::arr_在静态断言中创建具有相同类型的数组实例:

class Foo {
    std::array<int, kArraySize> arr_;
    static_assert(decltype(arr_){}.size() == kAnotherArraySize, "");
};
Run Code Online (Sandbox Code Playgroud)

请参阅此示例

注意:这仅在数组值类型是 POD 或具有默认 constexpr 构造函数时才有效。