• # Correction § "Remplacement du SFINAE"

    Posté par (site web personnel) . En réponse à la dépêche C++17 branche à la compilation (`if constexpr`). Évalué à 3. Dernière modification le 05 décembre 2016 à 15:09.

    Le code suivant est utilisé dans la dépêche, mais il est ambigu car on ne voit pas la différence au niveau de la déclaration des deux fonctions :

    template<class T>
    auto f(T x) -> decltype(std::enable_if_t<std::is_function_v<decltype(T::f)>,int>{})
    {
     return x.f();
    }
    template<class T>
    auto f(T x) -> decltype(std::enable_if_t<!std::is_function_v<decltype(T::f)>,int>{})
    {
     return 0;
    }

    Merci à un modérateur de le remplacer par :

    template<class T>
    auto f(T x) -> decltype(std::enable_if_t< std::is_function_v<decltype(T::f)>,int>{})
    { // ^---true si T::f existe et que c'est une fonction
     return x.f();
    }
    template<class T>
    auto f(T x) -> decltype(std::enable_if_t< ! std::is_function_v<decltype(T::f)>,int>{})
    { // ^---le contraire
     return 0;
    }

    Commentaire sous licence Creative Commons Zero CC0 1.0 Universal (Public Domain Dedication)