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

C ++ 11标准指定了一个类型trait 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

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的吸吮是一个完全独立的问题,与你的问题无关。 :)

编辑:这是一个constexpr_max在当今的C ++ 11中起作用。 不幸的是,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...));
}
链接地址: http://www.djcxy.com/p/16129.html

上一篇: Standard type trait for the value of sizeof(T)

下一篇: GHC TypeLits overhead