gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:49:23 24 4
gpt4 key购买 nike

编译时检查std::array数据成员的(编译时)大小
我需要静态断言,非模板类的std::array类型(即arr_)类型的非constexpr数据成员的编译时大小等于给定的(外部提供的)常量。静态断言将从类内部完成,这意味着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() {}

最佳答案

该标准提供了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

关于c++ - 非类模板(C++ 14)中数据成员std::array的编译时间大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63738539/

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