Си Callback и Си++ класс

Тема в разделе "LANGS.C", создана пользователем Rel, 5 фев 2011.

  1. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    а как вы прикрутите sigc++ к сишному коду который вызывает каллбек он это делает имея только адрес а в sigc++ предполагается вызывающий каллбек код должен это делать через функтор только хак и остается как в случае с CreateThread
    //поправьте если не прав
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    тут надо глубже осмотреть реализацию sigc++ или буста например) с первого взгляда и в вашем рсдн-хаке тоже не явно видно, как это сделать... просто для оупенсорц-тим проекта я бы вообще не стал использовать подобные вещи, тем более, что нужна переносимость (win/nix/mac и x86/x64), тут надо много думать и много доков составлять))) но похоже я нашел способ в FMOD-либе обойтись и без калбека... спасибо всем за помощь!
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Что-то типо такого.
    Код (Text):
    1. #include <vector>
    2. #include <iostream>
    3. #include <algorithm>
    4.  
    5. typedef void (*callback)();
    6.  
    7. class T
    8. {
    9. public:
    10.     void operator () ()
    11.     {
    12.         std::cout<<this<<std::endl;
    13.     }
    14. };
    15.  
    16. std::vector<typename T*> array;
    17.  
    18. template<int i>
    19. void callback_func()
    20. {
    21.     std::cout<<i<<" = ";
    22.     (*array[i])();
    23. }
    24.  
    25. template<int n>
    26. void init_func(std::vector<callback> &v)
    27. {
    28.     init_struct<n, n>::init_func(v);
    29. }
    30.  
    31. template<int n, int i>
    32. struct init_struct
    33. {
    34.     static void init_func(std::vector<callback> &v)
    35.     {
    36.         v.push_back(&callback_func<n-i>);
    37.         init_struct<n, i-1>::init_func(v);
    38.     }
    39. };
    40.  
    41. template<int n>
    42. struct init_struct<n, 0>
    43. {
    44.     static void init_func(std::vector<callback> &v)
    45.     {}
    46. };
    47.  
    48.  
    49. int main (int argc, char* argv[])
    50. {
    51.     const int n = 100;
    52.     std::vector<callback> v;
    53.     array.resize(n);
    54.     std::generate(array.begin(), array.end(), [](){return new T();});
    55.     init_func<n>(v);
    56.     std::for_each(v.begin(), v.end(), [](callback f){f();});
    57. }
     
  4. reversecode

    reversecode Guest

    Публикаций:
    0
    Rel
    что то я читал читал так и не понял
    можно пример?

    функция на С которая хочет калбек получает два параметра? функцию калбек и void * ?

    почему через static функцию класса нельзя такое сделать?
     
  5. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    SetTimer пример принимает каллбек без возможности передать юзер дату
     
  6. reversecode

    reversecode Guest

    Публикаций:
    0
    SetTimer не очень удачный пример
    потому что он принимает hWnd
    по которому можно уже разобратся какое окно итд

    хорошо, если я правильно понял
    то класс который должен использовать каллбек тогда проще обьявить как static
    и использовать

    static ClassA1 cla1;

    void CallBackFN()
    {
    cla1.CallBackFN();
    }

    SetTimerOther(...,CallBackFN, ..);
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    заставляет юзать глобальные переменные
    плюс это придется писать враппер для каждого инстанса
     
  8. reversecode

    reversecode Guest

    Публикаций:
    0
    а это прям таки запрещено религией С++ ?
    при правильном подходе это красиво и хорошо

    если используется одна либа как у ТС и используется один раз каллбек
    то не вижу проблем

    если же кто то использует _дофига_ таких либ
    то это уже проблема не инстансов и калбеков, а пробела разработчика который ничего своего сделать не может
    а бегает и тягает какой то левый С код с калбеками

    врочем дальше это уже трольное общения
    свой вариант я предложил) ТС сам пусть решает

    но и вариант Бустера мне не нравится
    он имеет смысл только если каллбеков реально _дохрена_
    а на 20 каллбеках в пределах одного проекта, мой вариант допустим
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    нет... не о глобальных переменных речи идти не может...

    свой калбек для каждого экземпляра, экземпляров от 20 до 100 примерно...

    да, давайте, отреверсите, а затем перепишите мне библиотеку FMOD)))

    ЗЫ вопрос закрыт... спасибо всем за помощь! пересмотрел интерфейс, в результате обхожусь без калбека...