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

时间:2013-09-26 05:08:15

标签: c++ c++11 c++-standard-library

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

1 个答案:

答案 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...));
}