Właściwie Twój wykrywania potencjalnie błędne.
Problemem jest to, że wszystko, co wykryły, że C
ma człon size
:
- może to być atrybut
- może to być metoda z cokolwiek podpis
- nie może być nawet kilka metody (z różnymi sygnaturami)
Jeśli chcesz wzmocnić wykrywanie, powinieneś spróbować wykryć tylko prawosize
(niezależnie od tego, jakie jest prawo). Here is such a hardened detection.
template <typename T>
class has_size {
private:
typedef char Yes;
typedef Yes No[2];
template <typename U, U> struct really_has;
template <typename C> static Yes& Test(really_has <size_t (C::*)() const,
&C::size>*);
// EDIT: and you can detect one of several overloads... by overloading :)
template <typename C> static Yes& Test(really_has <size_t (C::*)(),
&C::size>*);
template <typename> static No& Test(...);
public:
static bool const value = sizeof(Test<T>(0)) == sizeof(Yes);
};
Edit:with overloads.
Sztuczka polegająca na użyciu nieprawidłowych elementów size
to struktura really_has
. Robię nie udaje, że jest doskonały, choć ...
w C++ 11, things are simpler (choć nie mniej gadatliwy), ponieważ można wykryć rzeczy przez użytku bezpośrednio. Równowartość cecha jest tak:
template <typename T>
class has_size {
private:
typedef char Yes;
typedef Yes No[2];
template<typename C> static auto Test(void*)
-> decltype(size_t{std::declval<C const>().size()}, Yes{});
template<typename> static No& Test(...);
public:
static bool const value = sizeof(Test<T>(0)) == sizeof(Yes);
};
jednak zalecana metoda w C++ jest nie używać cech jeśli możesz; w funkcjach można na przykład użyć decltype
bezpośrednio w podpisie typu.
To również wykryje członków danych. – jrok
Może to być przydatne: http://pl.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector - _Edit: _ also: http://stackoverflow.com/questions/257288/is-it-possible- to-write-ac-template-to-check-for-a-functions-exist (nie przestawaj przy pierwszej odpowiedzi) –
@jrok W porządku, będzie używane w funkcji szablonu, która spowoduje kompilację błąd, jeśli nie jest funkcją - mogę z tym żyć. – nijansen