c – sizeof(T)值的标准类型特征

C 11标准指定了类型特征std :: alignment_of< T>.它只返回alignof(T)的值.

sizeof运算符是否有类似的特征?我只是错过了它,或者它只是在标准中错过了,还是有一些模糊的技术原因为什么没有指定?

显然创建这样的特性是微不足道的,但我无法想象在引入std :: alignment_of时不会考虑它.

对于上下文,我有一个自定义类型特征,用于在应用于类型列表时获取单个特征的最大值.

template <template<class> class Trait,typename F,typename... T>
struct trait_max
  : std::integral_constant<decltype(Trait<F>::value),(Trait<F>::value > trait_max<Trait,T...>::value) ? Trait<F>::value : trait_max<Trait,T...>::value>
{ };
template <template<class> class Trait,typename F>
struct trait_max<Trait,F>
  : std::integral_constant<decltype(Trait<F>::value),Trait<F>::value>
{ };

当你需要知道一组类型的最大值时,这个特性非常方便:

auto max_align = traits_max<std::alignment_of,int,float,std::string>::value;
auto max_size = traits_max<std::size_of,std::string>::value; // doesn't exist

解决方法

std :: alignment_of在C 11中不是新的.它在2007年作为TR1的一部分被添加(以及< type_traits>的其余部分).TR1的< type_traits>是从 Boost TypeTraits批发复制的,只提供了alignment_of,因为2005年没有标准的方法来获得该值.

当然在2005年有一种方法可以获得T型的尺寸;它自古以来就被拼写为sizeof(T).这就是size_of< T>不是在Boost TypeTraits中,这就是为什么它在2007年没有被复制到TR1中,这就是为什么它没有被归入C 11.

截至2011年,还有一种标准的方式来获得T型的对齐;它拼写为alignof(T). 2011年之前的构造std :: alignment_of< T> ::值是不必要的冗长,除非您担心2011年之前的实现可移植性,否则您几乎肯定不应该再使用它了.

我相信编写示例代码最常用的方法

size_t max_align = std::max({alignof(int),alignof(float),alignof(std::string)});
size_t max_size = std::max({sizeof(int),sizeof(float),sizeof(std::string)});

一旦C 14滚动,std :: max将成为constexpr,因此这将在编译时计算并可用于模板元编程.但是C 11的std :: max的嗜好是一个完全独立的问题,与你的问题无关.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...