а как вы прикрутите sigc++ к сишному коду который вызывает каллбек он это делает имея только адрес а в sigc++ предполагается вызывающий каллбек код должен это делать через функтор только хак и остается как в случае с CreateThread //поправьте если не прав
тут надо глубже осмотреть реализацию sigc++ или буста например) с первого взгляда и в вашем рсдн-хаке тоже не явно видно, как это сделать... просто для оупенсорц-тим проекта я бы вообще не стал использовать подобные вещи, тем более, что нужна переносимость (win/nix/mac и x86/x64), тут надо много думать и много доков составлять))) но похоже я нашел способ в FMOD-либе обойтись и без калбека... спасибо всем за помощь!
Что-то типо такого. Код (Text): #include <vector> #include <iostream> #include <algorithm> typedef void (*callback)(); class T { public: void operator () () { std::cout<<this<<std::endl; } }; std::vector<typename T*> array; template<int i> void callback_func() { std::cout<<i<<" = "; (*array[i])(); } template<int n> void init_func(std::vector<callback> &v) { init_struct<n, n>::init_func(v); } template<int n, int i> struct init_struct { static void init_func(std::vector<callback> &v) { v.push_back(&callback_func<n-i>); init_struct<n, i-1>::init_func(v); } }; template<int n> struct init_struct<n, 0> { static void init_func(std::vector<callback> &v) {} }; int main (int argc, char* argv[]) { const int n = 100; std::vector<callback> v; array.resize(n); std::generate(array.begin(), array.end(), [](){return new T();}); init_func<n>(v); std::for_each(v.begin(), v.end(), [](callback f){f();}); }
Rel что то я читал читал так и не понял можно пример? функция на С которая хочет калбек получает два параметра? функцию калбек и void * ? почему через static функцию класса нельзя такое сделать?
SetTimer не очень удачный пример потому что он принимает hWnd по которому можно уже разобратся какое окно итд хорошо, если я правильно понял то класс который должен использовать каллбек тогда проще обьявить как static и использовать static ClassA1 cla1; void CallBackFN() { cla1.CallBackFN(); } SetTimerOther(...,CallBackFN, ..);
а это прям таки запрещено религией С++ ? при правильном подходе это красиво и хорошо если используется одна либа как у ТС и используется один раз каллбек то не вижу проблем если же кто то использует _дофига_ таких либ то это уже проблема не инстансов и калбеков, а пробела разработчика который ничего своего сделать не может а бегает и тягает какой то левый С код с калбеками врочем дальше это уже трольное общения свой вариант я предложил) ТС сам пусть решает но и вариант Бустера мне не нравится он имеет смысл только если каллбеков реально _дохрена_ а на 20 каллбеках в пределах одного проекта, мой вариант допустим
нет... не о глобальных переменных речи идти не может... свой калбек для каждого экземпляра, экземпляров от 20 до 100 примерно... да, давайте, отреверсите, а затем перепишите мне библиотеку FMOD))) ЗЫ вопрос закрыт... спасибо всем за помощь! пересмотрел интерфейс, в результате обхожусь без калбека...