W https://stackoverflow.com/a/1967183/134841 roztwór przewidziane jest statycznie sprawdzenie, czy element istnieje, ewentualnie w podklasie typu:Kontrola członkiem zachodzi w klasie podstawowej ewentualnie, C++, 11 wersja
template <typename Type>
class has_resize_method
{
class yes { char m;};
class no { yes m[2];};
struct BaseMixin
{
void resize(int){}
};
struct Base : public Type, public BaseMixin {};
template <typename T, T t> class Helper{};
template <typename U>
static no deduce(U*, Helper<void (BaseMixin::*)(), &U::foo>* = 0);
static yes deduce(...);
public:
static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0)));
};
Jednak , nie działa na klasach C++ 11 final
, ponieważ dziedziczy po klasie, która jest w trakcie testu, co uniemożliwia.
OTOH, to jedno:
template <typename C>
struct has_reserve_method {
private:
struct No {};
struct Yes { No no[2]; };
template <typename T, typename I, void(T::*)(I) > struct sfinae {};
template <typename T> static No check(...);
template <typename T> static Yes check(sfinae<T,int, &T::reserve> *);
template <typename T> static Yes check(sfinae<T,size_t,&T::reserve> *);
public:
static const bool value = sizeof(check<C>(0)) == sizeof(Yes) ;
};
nie znajdzie sposobu, w baseclasses reserve(int/size_t)
.
Czy jest realizacja tego metafunkcji że zarówno znajdzie reserved()
w baseclasses z T
i nadal działa, jeśli T
jest final
?
W C++ 11 można po prostu użyć "sfinae dla wyrażeń", zamiast wykonywać tę okrężną ścieżkę wymaganą w C++ 03. –
@ JohannesSchaub-litb Wniosek o rozwiązanie! Chciałbym zobaczyć różnicę, jaką przynosi to tego rodzaju przykładowi. – stinky472