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的嗜好是一个完全独立的问题,与你的问题无关.