Discussion:C++/À faire
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)
[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)