Discussion:C++/À faire

Le contenu de la page n’est pas pris en charge dans d’autres langues.
Une page de Wikipédia, l'encyclopédie libre.
Autres discussions [liste]
  • Admissibilité
  • Neutralité
  • Droit d'auteur
  • Article de qualité
  • Bon article
  • Lumière sur
  • À faire
  • Archives
  • Commons

Il faudrait un exemple complet d'heritage multiple virtuel, bien construit et montrant les limites / erreurs à ne pas faire! Papapoilut (d) 16 janvier 2012 à 11:09 (CET)[répondre]

[Suggestion]Code qui ne se compile pas ?[modifier le code]

Bonjour,

il se trouve que dans la partie "Modeles", section SFINAE le code suivant (ne compile pas) :

<syntaxhighlight lang="c++">

#include <iostream>

class A

{

public:

    int foo()

    {

        return 3;

    }

};

class B

{

public:

    int bar()

    {

        return 5;

    }

};

class C : public A, public B {};

template <typename T>

auto f(const T& f) -> decltype(f.foo())

{

    return f.foo();

}

template <typename T>

auto f(const T& f) -> decltype(f.bar())

{

    return f.bar();

}

int main()

{

    A a{};

    B b{};

   

    std::cout << f(a) << '\n'; // affiche 3 en appellant a.foo()

    std::cout << f(b) << '\n'; // affiche 5 en appellant b.bar()

    // std::cout << f(C{}) << '\n'; // ne compile pas, en effet, C a les deux

                                    // fonctions membres, ainsi la déduction est

                                    // ambigue

    // std::cout << f(5) << '\n'; // ne compile pas, en effet, int n'a aucune des

                                 // deux fonctions membre

}

</syntaxhighlight>

Ne compile pas. (2 warnings et 2 erreurs avec les compilateur g++ et clang).

Peut on regler ce probleme ?

Je peux faire une suggestion de code mais n'etant pas un expert, ce n'est peut etre pas la meilleur maniere de faire.

voici la suggestion:

<syntaxhighlight lang="c++">

#include <iostream>

#include <type_traits>

class A

{

public:

    int foo()

    {

        return 3;

    }

};

class B

{

public:

    int bar()

    {

        return 5;

    }

};

class C : public A, public B {};

// Template function for classes with foo() method

template <typename T>

auto f(T& obj) -> typename std::enable_if<std::is_same<decltype(&T::foo), int (T::*)()>::value, int>::type

{

    return obj.foo();

}

// Template function for classes with bar() method

template <typename T>

auto f(T& obj) -> typename std::enable_if<std::is_same<decltype(&T::bar), int (T::*)()>::value, int>::type

{

    return obj.bar();

}

int main()

{

    A a{};

    B b{};

   

    std::cout << f(a) << '\n'; // affiche 3 en appellant a.foo()

    std::cout << f(b) << '\n'; // affiche 5 en appellant b.bar()

}

</syntaxhighlight> 2A02:8428:5AF:3701:F0AF:E0DC:DFD1:E0D0 (discuter) 21 mai 2024 à 12:46 (CEST)[répondre]