2016-11-14 31 views
11

Özel tipler için std::tuple_size ve std::tuple_element uzmanlıklarına izin verilir mi? Sanırım öyle, ama kesinlikle emin olmak istiyorum ve hiçbir somut bilgi bulamıyorum.C++: std :: tuple_size/tuple_element uzman olabilir mi?

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; }; 
} 

I yapısal bağları ile kullanım için bu gerekir:

Örnek (ad alanları, üye işlevlerini ve get<I> aşırı yükler ihmal) kullanıcı tanımlı türleri için

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

cevap

11

Uzmanlıklara genellikle ince ve her zaman olmuştur. N4606, [namespace.std]/1:

bildirimi kullanıcı tanımlı bir tipine bağlıdır ve uzmanlık standart kütüphane gereksinimlerini karşılayan yalnızca std ad alanı için herhangi bir standart kütüphane şablonu için bir şablon uzmanlık ekleyebilir bir program Orijinal şablon için ve açıkça yasak değildir.

tuple_size için, orijinal şablon için gereksinimler/1 [tuple.helper] belirtilir: tuple_size<T> ait

Tüm uzmanlık bazı N için integral_constant<size_t, N> bir BaseCharacteristic ile UnaryTypeTrait şartları yerine getirmek zorundadır. [Meta.rqmts]/1 sırayla

UnaryTypeTrait

,:

bir UnaryTypeTrait tipte bir özelliği tarif edilmektedir. Bir şablon türü argümanı ve isteğe bağlı olarak açıklanan özelliğin tanımlanmasına yardımcı olan ek argümanlar alan bir sınıf şablonu olacaktır. Bu DefaultConstructible, CopyConstructible olabilir ve genel olarak ve açık bir şekilde, özellikle özelliği tarif edilmektedir gereksinimleri tarafından belirlenir şablon integral_constant bağımsız değişken ile, şablon integral_constant bir uzmanlık onun BaseCharacteristic, doğrudan veya dolaylı olarak elde edilen eder. BaseCharacteristic'in üye isimleri gizlenmeyecek ve UnaryTypeTrait'da açık bir şekilde bulunacaktır.

tuple_element böyle gerektiriyor/6 ve [meta.rqmts]/3, ama kısalık açısından burada onları post olmaz [tuple.helper] belirtilmiştir. Gerçekten uzmanlık için yasal olduğunu söylemek için ...

+1

Yeni + auto [a, b, c] yapısal bağlamaları özelliğini kullanmak için C++ 1z'de bunu yapmanız gerektiğini unutmayın. – Yakk