Здравствуйте, ProperEducation, Вы писали:
PE>Из-за неработающего поиска, прогуглил rsdn, в принципе ответ нашел здесьАвтор: Кодёнок
Дата: 27.12.05
.
PE>За исключением того, что у меня не шаблонный метод, на MSVC 2005 работает:
[кусь]
template<typename T>
struct is_method_exist
{
template<int (T::*)(int)>//сигнатура метода
struct signature{};
template <typename T_>
static char method_signature_test(const T_&, int, signature<&T_::Foo> *p = 0);
template<typename T_>
static double method_signature_test(const T_&, ...);
static const bool is_exist=(1==sizeof(method_signature_test(T(), 0))); // тут еще стоит поменять T() на вызов функции возвращающей Т, чтобы не требовать конструктора по умолчанию.
};
class A { public:
int Foo(int i){return 0;} };
class B{};
bool bA=is_method_exist<A>::is_exist;//true
bool bB=is_method_exist<B>::is_exist;//false
// проверяем правильность определения.
template <bool check>
struct is_true;
template<>
struct is_true<true>
{
};
is_true<is_method_exist<A>::is_exist> exists_in_A;
is_true<!is_method_exist<B>::is_exist> exists_in_B;
The last good thing written in C was Franz Schubert's Symphony No. 9.