Nachdem ich Matthieus Antwort here gelesen hatte, beschloss ich, das selbst zu versuchen.SFINAE declype comma operator trick
Mein Versuch kann nicht kompiliert werden, da SFINAE die has_foo
-Funktion, die versucht, auf T::foo
zuzugreifen, nicht eingibt und ausgibt.
error: ‘struct Bar’ has no member named ‘foo’
Fehle ich etwas, oder versuche ich auf diese Weise nicht zu tun?
(Ich bin mit gcc-4.7.2)
Voll Examplar unter:
#include <iostream>
// culled by SFINAE if foo does not exist
template<typename T>
constexpr auto has_foo(T& t) -> decltype((void)t.foo, bool())
{
return true;
}
// catch-all fallback for items with no foo
constexpr bool has_foo(...)
{
return false;
}
//-----------------------------------------------------
template<typename T, bool>
struct GetFoo
{
static int value(T& t)
{
return t.foo;
}
};
template<typename T>
struct GetFoo<T, false>
{
static int value(T&)
{
return 0;
}
};
//-----------------------------------------------------
template<typename T>
int get_foo(T& t)
{
return GetFoo<T, has_foo(t)>::value(t);
}
//-----------------------------------------------------
struct Bar
{
int val;
};
int main()
{
Bar b { 5 };
std::cout << get_foo(b) << std::endl;
return 0;
}
Es sagt 'Val' Mann, nicht' foo'! – Rapptz
@Rapptz - genau! Es soll ** die Methode 'has_foo (true)' ** cull 'und die Fallback-Methode verwenden –
Ah Mann, Entschuldigung. Ich habe es einfach schnell überflogen, so dass ich die Frage nicht ganz verstanden habe :) – Rapptz