`enable_if ()` pour désactiver la déclaration de fonction membre statique d'une classe basée sur un modèle


user3124812

J'essaie de déclarer la fonction dans la classe de modèle afin que la déclaration de fonction dépende d'un argument de type de modèle.

template<typename T>
struct Block
{
    static bool parse(int32_t index, 
                      const typename std::enable_if<std::is_class<T>::value, T>::type& value);

    static bool parse(int32_t index, 
                      typename std::enable_if<!std::is_class<T>::value, T>::type value);
....

};

Donc je veux avoir, dire, Block<uint16_t>et Block<std::string>et parse()est déclaré comme:

bool parse(int32_t index, const std::string& value);
or
bool parse(int32_t index, uint16_t value);

Mais j'obtiens une erreur: 'enable_if' cannot be used to disable this declaration ...typename std::enable_if<!std::is_class<T>::value, T>::type value);

Pouvez-vous m'aider à déclarer correctement les fonctions?
Merci.

xaxxon

Enable_if ne fonctionne que dans des contextes déduits. Dans votre exemple, la déduction est effectuée au moment du type de classe. Au moment où vous arrivez aux fonctions, T est déjà connu, il n'y a donc rien à déduire.

Vous pouvez créer un paramètre de modèle par ailleurs superflu, définir son type par défaut sur T, puis en déduire.

template<typename T>
struct Block
{
    // now parse has to deduce U
    template<typename U=T>
    static bool parse(int32_t index, 
                      typename std::enable_if<!std::is_class<U>::value, T>::type value);

Vos appelants ne sauront jamais qu'il parsey a réellement un paramètre de modèle, mais maintenant vous pouvez faire toutes les choses fantaisistes dessus.

Articles connexes