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, int, float, std::string>::value; // doesn't exist
答案 0 :(得分:3)
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>::value
是不必要的冗长,除非你担心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 ++ 11中的constexpr_max
。不幸的是,C ++ 11的std::initializer_list
不能在constexpr
上下文中使用; C ++ 14也正在修复它。
template<typename T> constexpr T constexpr_max(T t, T u) {
return t > u ? t : u;
}
template<typename T, typename... TT> constexpr T constexpr_max(T t, TT... ts) {
return constexpr_max(t, constexpr_max(ts...));
}