Domanda

Sto cercando di specializzarsi parzialmente un tratto per array di non cari:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};

Visual Studio 2010 mi dà un C2039 (type non è un elemento di enable_if...). Tuttavia, le Sfinae non dovrebbero semplicemente il fondo qui invece di dare un errore del compilatore? O Sfinae non si applica in questo caso?

Naturalmente potrei semplicemente separare le specializzazioni per non Cart e Char:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};

template<unsigned N>
struct is_container<char[N]> : std::false_type {};

Ma mi piacerebbe davvero sapere perché Sfinae non funziona in questo caso particolare.

È stato utile?

Soluzione

Controlla l'argomento "3.1 Specializzazioni di classe dei modelli" ahttp://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html

EDIT: nel caso in cui il link morischi BOOST.org ...

3.1 Abilitazione della classe Modello Specializzazioni La classe Specializzazioni possono essere abilitate o disabilitate con abilita_if. È necessario aggiungere un parametro di modello extra per le espressioni abilitanti. Questo parametro ha il valore valore predefinito. Per esempio:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };

template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };

L'istanza di A con qualsiasi tipo integrale corrisponde alla prima specializzazione, mentre qualsiasi tipo di punto galleggiante corrisponde al secondo. Tutti gli altri tipi corrispondono al modello principale. La condizione può essere qualsiasi espressione booleana a tempo di compilazione che dipende dagli argomenti del modello della classe. Si noti che ancora una volta, il secondo argomento per abilitare_if non è necessario; Il valore predefinito (vuoto) è il valore corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top