2016-11-14 47 views
11

std::tuple_sizestd::tuple_element是否允許自定義類型的特化? 我想是的,但我想絕對確定,我找不到任何具體的信息。C++:可以std :: tuple_size/tuple_element專門?

實施例(命名空間,成員函數和get<I>重載忽略):

template <typename T, size_t N> 
struct vector { T _data[N]; }; 

template<size_t I, typename T, size_t N> 
constexpr T& get(vector<T,N>& vec) { return vec._data[I]; } 

namespace std { 
template<typename T, size_t N> 
class tuple_size< vector<T,N> > : public std::integral_constant<size_t, N> { }; 
template<size_t I, typename T, size_t N> 
class tuple_element< I, vector<T,N> > { public: using type = T; }; 
} 

我需要與結構化綁定使用:

void f(vector<T,3> const& vec) 
{ 
    auto& [x,y,z] = vec; 
    // stuff... 
} 

回答

11

專業化爲用戶定義的類型通常是精細和一直都是。 N4606,[namespace.std]/1:

的程序可以添加一個模板特爲任何標準庫模板到命名空間std僅當聲明取決於用戶定義的類型和專業化符合標準庫的要求爲原始模板,並沒有明確禁止。

對於tuple_size,對於原始模板的要求[tuple.helper]/1規定:

tuple_size<T>所有專業應滿足的integral_constant<size_t, N>一個BaseCharacteristicUnaryTypeTrait要求一些N

UnaryTypeTrait,反過來,在[meta.rqmts]/1:

UnaryTypeTrait描述了一種類型的屬性。它應該是一個類模板,它接受一個模板類型參數,並且還可以選擇其他參數來幫助定義所描述的屬性。它應該是DefaultConstructible,CopyConstructible,並且直接或間接地從它的基本特徵(它是模板integral_constant的專門化)以及由所描述的特定屬性的要求確定的模板integral_constant的參數公開且明確導出。 BaseCharacteristic的成員名稱不得隱藏,並且應該在UnaryTypeTrait中明確可用。

tuple_element的要求在[tuple.helper/6和[meta.rqmts/3,但爲了簡潔起見,我不會張貼在這裏指定。只需說專門化是合法的...

+1

請注意,在C++ 1z中需要使用新的'auto [a,b,c]'結構化綁定功能。 – Yakk