проверка наличия метода у класса
От: ProperEducation  
Дата: 10.08.08 21:37
Оценка:
Из-за неработающего поиска, прогуглил rsdn, в принципе ответ нашел здесь
Автор: Кодёнок
Дата: 27.12.05
.
За исключением того, что у меня не шаблонный метод, на 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_&,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())));//MSVC ok, однако Comeau Online Error
};

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


Однако Comeau Online не компилит
"error: more than one instance of overloaded function"
Вопрос в том, чего ему надо?
//We dont need no thought control
Re: проверка наличия метода у класса
От: crable США  
Дата: 11.08.08 03:42
Оценка: 6 (2)
Здравствуйте, 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.
Re[2]: проверка наличия метода у класса
От: ProperEducation  
Дата: 11.08.08 12:09
Оценка:
Здравствуйте, crable, Вы писали:

C>    static const bool is_exist=(1==sizeof(method_signature_test(T(), 0))); // тут еще стоит поменять T() на вызов функции возвращающей Т, чтобы не требовать конструктора по умолчанию.
C>};

fantastico
//We dont need no thought control
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.