Мне удалось найти решение, которое работает во всех основных компиляторах.К сожалению, есть проверка препроцессора для MSVC, потому что он жалуется на решение для других компиляторов.Основное отличие состоит в том, что MSVC не принимает указатели на функции внутри sizeof () и, наоборот, GCC, похоже, не принимает (&C::resize == 0)
в проверке.Clang с радостью принимает оба.
#include <iostream>
class Base {
public:
void resize(int, int, int) { }
};
class Derived : public Base {
};
class Unrelated { };
template<typename T>
class has_resize_method {
struct Yes { char unused[1]; };
struct No { char unused[2]; };
#ifdef _MSC_VER
template <class C>
static Yes test(char (*)[(&C::resize == 0) + 1]);
#else
template <class C>
static Yes test(char (*)[sizeof(&C::resize) + 1]);
#endif
template<class C>
static No test(...);
public:
static const bool value = (sizeof(test<T>(0)) == sizeof(Yes));
};
int main() {
std::cout << (has_resize_method<Base>::value ? "Base has method resize" : "Base has NO method resize") << std::endl;
std::cout << (has_resize_method<Derived>::value ? "Derived has method resize" : "Derived has NO method resize") << std::endl;
std::cout << (has_resize_method<Unrelated>::value ? "Unrelated has method resize" : "Unrelated has NO method resize") << std::endl;
return 0;
}
Вывод:
Base has method resize
Derived has method resize
Unrelated has NO method resize
Протестировано на GCC 4.5.3, GCC 4.3.4, Clang 3.0, Visual C ++ 2008 и Visual C ++ 2010. Я надеваюУ меня нет доступа к Visual C ++ 2005, но я думаю, что он тоже будет работать.Он также компилируется на Comeau Online , но я не могу гарантировать, что он выдаст правильный вывод там.
Работает как с финальными, так и с __sealed классами.
Обратите внимание, что он проверяет не толькодля функций-членов, но для указателей на членов в целом.Возможно, вы захотите добавить дополнительные проверки, такие как boost::is_member_function_pointer
, если это поведение нежелательно.Точно так же вы можете захотеть добавить проверки количества аргументов / типов аргументов / типов результатов - опять же, повышение будет очень полезно здесь, особенно. разложение типа буста .