На самом деле, ваше обнаружение потенциально ошибочны.
Проблема заключается в том, что все, что вы обнаружение, что C
имеет элемент size
:
- это может быть признак
- это может быть способом с любой подписью
- там может быть даже несколько методы (с различными сигнатурами)
Если вы хотите затвердеть обнаружение, вы должны попытаться обнаружить только size
(за все права). 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.
Уловка с неправильными size
членами является структурой really_has
. Я не претендую, что она идеально подходит, хотя ...
В C++ 11, things are simpler (хотя и не менее многословны), потому что вы можете обнаружить вещи использования непосредственно. Эквивалент черта таким образом:
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);
};
Однако рекомендуемый метод в C++ является не использовать черты если вы можете; в функциях, например, вы можете использовать decltype
прямо в типе.
Это также обнаружит элементы данных. – jrok
Это может быть полезно: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector - _Edit: _ также: http://stackoverflow.com/questions/257288/is-it-possible- to-write-ac-template-to-check-for-a-functions-существование (не останавливаться при первом ответе) –
@jrok Это нормально, он будет использоваться в функции шаблона, которая затем вызовет компиляцию если это не функция - я могу жить с этим. – nijansen