mar*_*ack 7 c++ c++-standard-library c++11
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>
{ };
Run Code Online (Sandbox Code Playgroud)
当你需要知道一组类型的最大值时,这个特性非常方便:
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
Run Code Online (Sandbox Code Playgroud)
std::alignment_of在 C++11 中并不新鲜。<type_traits>它于 2007 年作为 TR1 的一部分添加(与其余部分一起)。TR1 是从Boost TypeTraits<type_traits>批量复制的,之所以提供,只是因为 2005 年没有标准方法来获取该值。alignment_of
当然,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)});
Run Code Online (Sandbox Code Playgroud)
一旦 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...));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
928 次 |
| 最近记录: |