Наличие метода у типа
От: rus blood Россия  
Дата: 13.10.05 07:59
Оценка:
Здесь
Автор: MaximE
Дата: 13.09.03
представлен способ определения наличия метода у типа. Однако, при наличии перегруженного метода возникают проблемы.
struct Base
{
    void method(void) {}
    void method(char) {}
};

template <typename T, T val>
struct type_has_value {};

template <typename T>
char check_method(type_has_value<void (T::*)(void), &T::method>* = NULL);

template <typename T>
double check_method(...);

int main(int argc, char* argv[])
{
    int u = sizeof(check_method<Base>()); // == sizeof(double)
    return 0;
}

Почему не срабатывает подстановка?

VC 7.1
Имею скафандр — готов путешествовать!
Re: Наличие метода у типа
От: __LP  
Дата: 13.10.05 08:13
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Почему не срабатывает подстановка?


RB>VC 7.1


Странно... У меня на VC7.1 все нормально работает == sizeof(char)
C++ можно выучить за 21 день! ...если дни — полярные.
Re[2]: Наличие метода у типа
От: rus blood Россия  
Дата: 13.10.05 08:35
Оценка:
Здравствуйте, __LP, Вы писали:

Упс...

Сейчас проверял ответ на один из вопросов по Win32, ну и вставил в код #include <windows.h>.
Заработало, блин.

Без строки "#include <windows.h>" не работает — sizeof(double).

Что за ???
Имею скафандр — готов путешествовать!
Re[3]: Наличие метода у типа
От: __LP  
Дата: 13.10.05 08:47
Оценка: 6 (1)
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, __LP, Вы писали:


RB>Упс...


RB>Сейчас проверял ответ на один из вопросов по Win32, ну и вставил в код #include <windows.h>.

RB>Заработало, блин.

RB>Без строки "#include <windows.h>" не работает — sizeof(double).


RB>Что за ???


Похоже на продолжение мистической истории с хедерами
Автор: Lorenzo_LAMAS
Дата: 14.11.03
. У меня и без #include <windows.h> работает.
C++ можно выучить за 21 день! ...если дни — полярные.
Re[4]: Наличие метода у типа
От: rus blood Россия  
Дата: 13.10.05 09:02
Оценка:
Здравствуйте, __LP, Вы писали:

__L>Похоже на продолжение мистической истории с хедерами
Автор: Lorenzo_LAMAS
Дата: 14.11.03
. У меня и без #include <windows.h> работает.


Не похоже, а ровно то же самое...
Имею скафандр — готов путешествовать!
Re: Наличие метода у типа
От: rus blood Россия  
Дата: 13.10.05 14:03
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здесь
Автор: MaximE
Дата: 13.09.03
представлен способ определения наличия метода у типа. Однако, при наличии перегруженного метода возникают проблемы.


Ну и как с этим жить?

Разные конструкции по-разному реагируют на наличие инклюдников...
Имею скафандр — готов путешествовать!
Re[2]: Наличие метода у типа
От: __LP  
Дата: 13.10.05 16:05
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, rus blood, Вы писали:


RB>>Здесь
Автор: MaximE
Дата: 13.09.03
представлен способ определения наличия метода у типа. Однако, при наличии перегруженного метода возникают проблемы.


RB>Ну и как с этим жить?


RB>Разные конструкции по-разному реагируют на наличие инклюдников...


Может быть здесь спросить: microsoft.public.vc
C++ можно выучить за 21 день! ...если дни — полярные.
Re[2]: Наличие метода у типа
От: __LP  
Дата: 15.10.05 21:59
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, rus blood, Вы писали:


RB>>Здесь
Автор: MaximE
Дата: 13.09.03
представлен способ определения наличия метода у типа. Однако, при наличии перегруженного метода возникают проблемы.


Я немного поэкспериментировал с этим кодом. Выяснилось, что на него влияют не только <windows.h> и <tchar.h>, но и <vector>, <list>, <map>, <string> и т.д. Однако с <deque> и <set> все нормально. Далее оказалось что хедеры тут cкорей всего не при чем. Я немного изменил код вот так:
#include <iostream>

using namespace std;

struct Base
{
    void method(void) {}
    void method(char) {}
};

template <typename T, T val>
struct type_has_value {};

template <typename T>
char check_method(type_has_value<void (T::*)(void), &T::method>* = NULL);

template <typename T>
double check_method(...);

int main(int argc, char* argv[])
{
    int u = sizeof(check_method<Base>());
    cout << u << endl;
    system("pause");
    return 0;
}

Он выдает 1. Но если между #include <iostream> и using namespace std;
вставить 205 или более пустых строк, то выводиться будет 8 (по крайней мере у меня так).
Попробуйте проверить, у кого еcть VC 7.1.

RB>Ну и как с этим жить?


- Доктор, я буду жить?
— Будете, ...но хреново. :(

C++ можно выучить за 21 день! ...если дни — полярные.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.