8

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
4

1 回答 1

3

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

当然,在 2005 年有一种方法可以获取类型的大小Tsizeof(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++11std::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...));
}
于 2013-10-07T21:43:37.783 回答