2013-09-26 57 views
7

C++ 11標準指定了一個類型特徵std::alignment_of<T>,它簡單地返回值alignof(T)sizeof(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

錯字在你的代碼,'特質'應該是'?'操作之後'特質'。我只注意到,因爲這太棒了,我非常喜歡它。 –

+2

std :: alignment_of '在標準中的唯一原因是因爲它是TR1的一部分。 – Simple

+2

幸運的是,'template struct size_of:std :: integral_constant {};'也不難寫。 – Yakk

回答

3

std::alignment_of是不是新的C++ 11。它是(伴隨着<type_traits>其餘部分)添加爲2007年TR1的從Boost TypeTraits<type_traits>被複制批發市場,其中規定alignment_of TR1的一部分,只是因爲沒有標準的方式在2005年

當然要獲取該值在2005年有一種獲得T類型大小的方法;它自古以來就拼寫爲sizeof(T)。這就是爲什麼size_of<T>不是在升壓TypeTraits和這是爲什麼它沒有複製到TR1在2007年和這是爲什麼它沒有盛行到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's 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...)); 
} 
+0

我在模板元編程中使用了這個特徵,所以示例代碼中的類型通常都是從可變參數模板中取出來的。類似於你的建議,'std :: max({sizeof(T)...});'是完美的,但是在'std :: max'上沒有'constexpr',我不得不訴諸於一個定製的特質。 我想我很驚訝這在標準化期間沒有出現。如果'align_of'在'alignof'世界中被認爲是無用的,爲什麼不貶低它呢?如果它仍然有用,爲什麼不添加類似的'size_of'?一個人生的小祕密...... – marack

+0

好吧,你不得不訴諸於「定製特質」*或*到一個自定義的constexpr max函數,如果你剛剛刪除了' trait_'從你的'trait_max'中移植。 :)我會用示例代碼更新我的答案。 – Quuxplusone

+0

非常好。謝謝! – marack