фокусы в шаблонах
От: PoM-PoM 40mm Россия  
Дата: 22.10.04 04:52
Оценка:
Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.

  template<class T>
  void SmartCaller(T *c)
   {
      if(???)  
       c->f(); 
   }


есть ли идеи как моджно выкрутиться?
Will give me piece of mind
Re: фокусы в шаблонах
От: Евгений Коробко  
Дата: 22.10.04 05:18
Оценка: -1
Это сделать невозможно, поскольку в С++ нет reflection и программа не может определить в момент исполнения, у кого есть какой метод. Используй полиморфизм
Posted via RSDN NNTP Server 1.9 gamma
Евгений Коробко
Re[2]: фокусы в шаблонах
От: PoM-PoM 40mm Россия  
Дата: 22.10.04 06:22
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>Это сделать невозможно, поскольку в С++ нет reflection и программа не может определить в момент исполнения, у кого есть какой метод. Используй полиморфизм


ну reflection тут не причем вроде, я и не требую рантайма. Ведь функция шаблонная и важно есть ли у типа T такое или нет. если нет то компиллер ругается, важно сделать чтоб не ругалось
Will give me piece of mind
Re: фокусы в шаблонах
От: Bell Россия  
Дата: 22.10.04 06:39
Оценка:
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.


PP4>
PP4>  template<class T>
PP4>  void SmartCaller(T *c)
PP4>   {
PP4>      if(???)  
       c->>f(); 
PP4>   }
PP4>


PP4>есть ли идеи как моджно выкрутиться?


Посмотри здесь
Автор: MaximE
Дата: 13.09.03
плюс воспользуйся поиском по "SFINAE".
Любите книгу — источник знаний (с) М.Горький
Re: фокусы в шаблонах
От: korzhik Россия  
Дата: 22.10.04 06:39
Оценка:
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.


PP4>
PP4>  template<class T>
PP4>  void SmartCaller(T *c)
PP4>   {
PP4>      if(???)  
       c->>f(); 
PP4>   }
PP4>


может способ издоженный здесь
Автор: folk
Дата: 19.04.04
поддолкнёт тебя к решению.
Re[2]: фокусы в шаблонах
От: korzhik Россия  
Дата: 22.10.04 06:43
Оценка:
Здравствуйте, korzhik, Вы писали:

K>может способ издоженный здесь
Автор: folk
Дата: 19.04.04
поддолкнёт тебя к решению.


сорри, немного не ту ссылку дал, правильная у Bell'а
Re: фокусы в шаблонах
От: LaptevVV Россия  
Дата: 22.10.04 06:46
Оценка:
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.


PP4>
PP4>  template<class T>
PP4>  void SmartCaller(T *c)
PP4>   {
PP4>      if(???)  
       c->>f(); 
PP4>   }
PP4>


PP4>есть ли идеи как моджно выкрутиться?

У Герба Саттера описывается нечто подобное: проверяется. есть ли в классе метод с определенным прототипом. Причем решается на шаблонах.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: фокусы в шаблонах
От: yxiie Украина www.enkord.com
Дата: 22.10.04 07:37
Оценка: 5 (1) +1
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.


PP4>
PP4>  template<class T>
PP4>  void SmartCaller(T *c)
PP4>   {
PP4>      if(???)  
       c->>f(); 
PP4>   }
PP4>


PP4>есть ли идеи как моджно выкрутиться?


Мне тоже когда-то нужно было подобное. Решил так: вынес нужный метод в отдельный класс и проверял на наличие этого
класса в иерархии предков с помощью boost::is_base_and_derived
... << RSDN@Home 1.1.3 stable >>
Re: фокусы в шаблонах
От: Went  
Дата: 22.10.04 07:57
Оценка:
Здравствуйте, PoM-PoM 40mm

Есть Майкрософт специфик "__if_exists". Возможно, Вас это устроит
Re[2]: фокусы в шаблонах
От: Andrew S Россия http://alchemy-lab.com
Дата: 22.10.04 08:12
Оценка:
PP4>>Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.

PP4>>
PP4>>  template<class T>
PP4>>  void SmartCaller(T *c)
PP4>>   {
PP4>>      if(???)  
       c->>>f(); 
PP4>>   }
PP4>>


PP4>>есть ли идеи как моджно выкрутиться?

LVV>У Герба Саттера описывается нечто подобное: проверяется. есть ли в классе метод с определенным прототипом. Причем решается на шаблонах.

Там не совсем то, а точнее, совсем не то — без ошибки компиляции проверяется только наличие наследования. Тут же подойдет только SFINAE, но эту технику поддерживают далеко не все компиляторы.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: фокусы в шаблонах
От: Аноним  
Дата: 22.10.04 09:59
Оценка: 6 (1) -1
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.


PP4>
PP4>  template<class T>
PP4>  void SmartCaller(T *c)
PP4>   {
PP4>      if(???)  
       c->>f(); 
PP4>   }
PP4>


PP4>есть ли идеи как моджно выкрутиться?


Ну можно попробовать че-нить типа

template<class T>
class HasFunction
{
private:
    typedef double YesVal;
    typedef char NoVal;

    static YesVal Test(  void(T::*FunPtr)(int)  );
    static NoVal Test( ... );


public:
    enum { Yes = sizeof(Test( &T::Function )) == sizeof(YesVal) , No = !Yes };
};
Re[3]: фокусы в шаблонах
От: WolfHound  
Дата: 22.10.04 11:06
Оценка: 6 (1)
Здравствуйте, korzhik, Вы писали:

K>сорри, немного не ту ссылку дал, правильная у Bell'а

Нет у Bell'а ссылка не правильная. Вот правильная ссылка Re[11]: ЭВРИКА
Автор: WolfHound
Дата: 14.11.03
.
... << RSDN@Home 1.1.4 rev. 185 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: фокусы в шаблонах
От: Аноним  
Дата: 22.10.04 11:09
Оценка: :)
AS>Там не совсем то, а точнее, совсем не то — без ошибки компиляции проверяется только наличие наследования. Тут же подойдет только SFINAE, но эту технику поддерживают далеко не все компиляторы.

А Л.В. об этом уже говорили ,но он все равно упорно продолжает советовать Саттера в таких случаях
Re: фокусы в шаблонах
От: mopnex Россия  
Дата: 22.10.04 11:41
Оценка:
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.


PP4>
PP4>  template<class T>
PP4>  void SmartCaller(T *c)
PP4>   {
PP4>      if(???)  
       c->>f(); 
PP4>   }
PP4>


PP4>есть ли идеи как моджно выкрутиться?



Это идея нашла свою реализацию в COM. Если с — это COM-объект.
IXXX *pPtr = NULL;
if ( SUCCEEDED( c->QueryInterface( IID_IXXX, (void**) &pPtr ))
{
pPtr->f();
pPtr->Release();
}
Re[2]: фокусы в шаблонах
От: vdimas Россия  
Дата: 22.10.04 12:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, PoM-PoM 40mm, Вы писали:


PP4>>Хотелось бы сделать такой фокус -- шаблонная функция принимает указатель на класс и если в классе есть функция с определенным именем, то вызывает ее. иначе ничего не делается.


PP4>>
PP4>>  template<class T>
PP4>>  void SmartCaller(T *c)
PP4>>   {
PP4>>      if(???)  
       c->>>f(); 
PP4>>   }
PP4>>


PP4>>есть ли идеи как моджно выкрутиться?


А>Ну можно попробовать че-нить типа


А>
А>template<class T>
А>class HasFunction
А>{
А>private:
А>    typedef double YesVal;
А>    typedef char NoVal;

А>    static YesVal Test(  void(T::*FunPtr)(int)  );
А>    static NoVal Test( ... );


А>public:
А>    enum { Yes = sizeof(Test( &T::Function )) == sizeof(YesVal) , No = !Yes };
А>};

А>



точно, оно!
Re[3]: фокусы в шаблонах
От: vdimas Россия  
Дата: 22.10.04 12:27
Оценка:
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Здравствуйте, Евгений Коробко, Вы писали:


ЕК>>Это сделать невозможно, поскольку в С++ нет reflection и программа не может определить в момент исполнения, у кого есть какой метод. Используй полиморфизм


PP4>ну reflection тут не причем вроде, я и не требую рантайма. Ведь функция шаблонная и важно есть ли у типа T такое или нет. если нет то компиллер ругается, важно сделать чтоб не ругалось


MS расширения:
__if_exists
__if_not_exists
Re[2]: фокусы в шаблонах
От: Bell Россия  
Дата: 22.10.04 12:28
Оценка:
Здравствуйте, mopnex, Вы писали:

Есть только одно маленькое "но": в СОМ все происходит в run-time...
Любите книгу — источник знаний (с) М.Горький
Re[2]: фокусы в шаблонах
От: alexeiz  
Дата: 23.10.04 07:34
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, PoM-PoM 40mm


W>Есть Майкрософт специфик "__if_exists". Возможно, Вас это устроит


А вот этого не надо. Вполне возможно в следующей версии такого уже не будет.
Re[3]: фокусы в шаблонах
От: prVovik Россия  
Дата: 23.10.04 15:55
Оценка:
Здравствуйте, vdimas, Вы писали:

V>точно, оно!

Лучше прислушайся к тому, что тебе yxiie советует
Автор: yxiie
Дата: 22.10.04
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[4]: фокусы в шаблонах
От: vdimas Россия  
Дата: 24.10.04 23:35
Оценка:
Здравствуйте, prVovik, Вы писали:

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


V>>точно, оно!

V>Лучше прислушайся к тому, что тебе yxiie советует
Автор: yxiie
Дата: 22.10.04


мы не всегда можем что-то куда-то выносить, не так ли?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.