Информация об изменениях

Сообщение Re[2]: Интерфейс плагина и его vtable от 14.10.2017 9:33

Изменено 14.10.2017 9:34 AlexGin

Re[2]: Интерфейс плагина и его vtable
Здравствуйте, c-smile, Вы писали:

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


AG>>Доброе время суток, уважаемые коллеги!


CS>А какие проблемы?


CS>
CS>class IPluginlInterface
CS>{
CS>public:
CS>     static int iid() { return 1; }

CS>     virtual IPluginlInterface* GetInterface(int id) const = 0;
 
CS>     template<class IF>  
CS>       IF* Interface() const { return static_cast<IF*>(GetInterface(IF::iid())); }
      

CS>};

CS>class IPluginlInterface2 : IPluginlInterface
CS>{
CS>public:
CS>     static int iid() { return 2; }

CS>     virtual IPluginlInterface* GetInterface(int id) const 
CS>     {
CS>        if( id == iid() ) return this;
CS>        return IPluginlInterface::GetInterface(id);
CS>     }
CS>};
CS>



CS>Ну и использование


CS>
CS>IPluginlInterface* pp = ...;
CS>IPluginlInterface2* pp2 = pp->Interface<IPluginlInterface2>();
CS>



А нужен ли тут этот метод:
   template<class IF>  
      IF* Interface() const { return static_cast<IF*>(GetInterface(IF::iid())); }


Может проще вместо метода Interface<IF> — применять dynamic_cast

IPluginlInterface* pp = ...;
IPluginlInterface2* pp2 = dynamic_cast<IPluginlInterface2*>(pp);


Какие тут могут быть аргументированные соображения за или против?
Re[2]: Интерфейс плагина и его vtable
Здравствуйте, c-smile, Вы писали:

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


AG>>Доброе время суток, уважаемые коллеги!


CS>А какие проблемы?


CS>
CS>class IPluginlInterface
CS>{
CS>public:
CS>     static int iid() { return 1; }

CS>     virtual IPluginlInterface* GetInterface(int id) const = 0;
 
CS>     template<class IF>  
CS>       IF* Interface() const { return static_cast<IF*>(GetInterface(IF::iid())); }
      

CS>};

CS>class IPluginlInterface2 : IPluginlInterface
CS>{
CS>public:
CS>     static int iid() { return 2; }

CS>     virtual IPluginlInterface* GetInterface(int id) const 
CS>     {
CS>        if( id == iid() ) return this;
CS>        return IPluginlInterface::GetInterface(id);
CS>     }
CS>};
CS>



CS>Ну и использование


CS>
CS>IPluginlInterface* pp = ...;
CS>IPluginlInterface2* pp2 = pp->Interface<IPluginlInterface2>();
CS>



А нужен ли тут этот метод:
   template<class IF>  
      IF* Interface() const { return static_cast<IF*>(GetInterface(IF::iid())); }


Может проще вместо метода Interface<IF> — применять dynamic_cast
IPluginlInterface* pp = ...;
IPluginlInterface2* pp2 = dynamic_cast<IPluginlInterface2*>(pp);


Какие тут могут быть аргументированные соображения за или против?