Avoiding a static member function in C ++ when using the callback interface from C

I would like to access the data inside this member function, which is static. The member function is static now, so I can use it with a third-party API written in C that has a typdef function pointer for callback purposes. Based on the information below, what is the best way to get around the need to create a static function in order to use the data from the next member of the function as part of other member functions of my class that are non-static. Maybe there is a way to still use this static function, but still overcome the inability to mix static with non-stationary variables. My code works as it is, but without the ability to access data in the next callback function.

void TextDetect::vtrCB(vtrTextTrack *track, void *calldata) /*acts as a callback*/ { /*specifically would like to take data from "track" to a deep copy so that I don't loose scope over the data withing that struct */ } 

In the associated C API, there are the following two lines of code that I have to use:

  typedef void (*vtrCallback)(vtrTextTrack *track, void *calldata); int vtrInitialize(const char *inifile, vtrCallback cb, void *calldata); 

Here is the title of my class:

  #include <vtrapi.h> #include <opencv.hpp> class TextDetect { const char * inifile; vtrImage *vtrimage; int framecount; public: TextDetect(); ~TextDetect(); static void vtrCB(vtrTextTrack *track, void *calldata); int vtrTest(cv::Mat); bool DrawBox(cv::Mat&); }; TextDetect::TextDetect() : inifile("vtr.ini") { if (vtrInitialize(inifile, vtrCB /*run into problems here*/, NULL) == -1) std::cout << "Error: Failure to initialize" << std::endl; vtrimage = new vtrImage; framecount = 0; } void TextDetect::vtrCB(vtrTextTrack *track, void *calldata) /*acts as a callback*/ { /*specifically would like to take data from "track" to a deep copy so that I don't loose scope over the data withing that struct */ } 
+4
source share
1 answer

I'm not sure I understand your exact situation, but here is the standard idiom for porting a C ++ method to the C callback API:

 /*regular method*/ void TextDetect::vtrCB(vtrTextTrack *track) { // do all the real work here } /*static method*/ void TextDetect::vtrCB_thunk(vtrTextTrack *track, void *data) { static_cast<TextDetect *>(data)->vtrCB(track); } 

and then, assuming that the function that should call vtrInitialize is also a TextDetect method, you write the call like this:

  vtrInitialize(inifile, TextDetect::vtrCB_thunk, static_cast<void *>(this)); 
+7
source

All Articles