реклама на сайте
подробности

 
 
> Есть ли С++(осоьенно в IAR С++) возможность
_Артём_
сообщение Feb 9 2012, 13:36
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Есть ли С++(особенно интересует для IAR С++) возможность сделать указатель на метод экземпляра класса?
Ну или способ сделать тоже как-то по другому.

Из EWAVR_CompilerReference.pdf:
Цитата
POINTER TO MEMBER FUNCTIONS
A pointer to a member function can only contain a default function pointer, or a function
pointer that can implicitly be casted to a default function pointer. To use a pointer to a
member function, make sure that all functions that should be pointed to reside in the
default memory or a memory contained in the default memory.
Example
class X
{
public:
__nearfunc void F();
};
void (__nearfunc X::*PMF)(void) = &X::F;


Но пока что-т не получается использовать (или это пример не о том?).
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
neiver
сообщение Feb 11 2012, 13:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Я немного поэкспериментировал с делегатами по этой методике. В предельно сжатом виде получается что-то такое:
Код
struct GenericClass{};
typedef void (GenericClass::*VoidFuncPtr)();

class delegate{
public:
  template<class ObjT>
  explicit delegate(ObjT *obj, void (ObjT::*func)() )
  {
    _func = reinterpret_cast<VoidFuncPtr>(func);
    _pThis = reinterpret_cast<GenericClass*>(obj);
  }
  void operator ()(){
     (_pThis->*_func)();
  }
private:
  VoidFuncPtr _func;
  GenericClass *_pThis;
};

class Foo{
public:
  void Func(){
    PORTA = 0xff;
  }
};

int main()
{
  Foo foo;
  delegate d(&foo, &Foo::Func);
  d();
  return 0;}

Получается около 40-50 тактов на вызов такого делегата под IAR for AVR. Многовато. Это в 3-4 раза больше чем вызов обычной виртуальной функции. В прерываниях такое лучше не использовать.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 12 2012, 20:52
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Спасибо за ссылки и пример, думаю надолго разбираться хватит.

Цитата(neiver @ Feb 11 2012, 16:33) *
Получается около 40-50 тактов на вызов такого делегата под IAR for AVR. Многовато. Это в 3-4 раза больше чем вызов обычной виртуальной функции. В прерываниях такое лучше не использовать.


Смотря какое прерывание:
Код
#pragma vector=TIMER1_COMPA_vect
__interrupt void ISR_10_Hz()
{
// какие-то действия
}

если прерывание возникает с частотой десятки-сотни герц, то 40-50 тактов - сущий пустяки.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 03:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0206 секунд с 7
ELECTRONIX ©2004-2016