c++ - 非类模板中数据成员 std::array 的编译时间大小 (C++14)
问题描述
编译时检查 std::array 数据成员的(编译时)大小
我需要静态断言非模板类的类型为std::array
的非 constexpr 数据成员的编译时大小等于给定的(外部提供的)常量。静态断言将在类内部完成,意思是可以访问,但我不能依赖任何存储的常量(也不是非类型模板参数)的大小。即,断言需要完全依赖于对数据成员的“一些检查”。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() {}
解决方案
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
推荐阅读
- android - 检查调用 stopForeground(true)
- php - 使用 symfony2 在 mysql 中进行三级深度查询
- apache-spark - 进行管道拟合后如何保存模型?
- python - pony.orm 中与 create_tables=False 的关系
- jsf - 如何在 Liferay JSF portlet 中创建一个在表单/portlet 中弹出默认日志的链接/按钮?
- c++ - 定义小函数以将其声明为内联
- java - 仅在特定计算机上的 Java 堆空间内存不足
- mysql - 生成6个不重复的随机数MySQL
- c++ - urlmon.h 中的“ProcessName”未声明标识符
- android - 我可以计算 Rxjava 2 all 已经重试了多少次吗?