iOS использует завершение c ++ в объекте C

ПРИМЕР ПРОЕКТ РЕПО https://github.com/iamZoltanVaradi/PingPong

В моем приложении у меня есть следующий typedef в заголовке c ++:

typedef void (*OnComplete)(const std::string &successString, const std::string &failureString); 

Я поставил его в такую ​​функцию.

 void PingPong::requestPingPongWithBlock(const string text, OnComplete completion) { string successString = string(); string errorString = string(); if (text.compare("ping") == 0) { successString = "success ping"; } else { errorString = "failure pong"; } completion(successString, errorString); } 

и он вызывается в функции:

 - (void)requestPingPongWithText:(NSString*)text completion:(OnComplete) compblock{ PingPong::requestPingPongWithBlock([text UTF8String],compblock); } 

но когда я называю это так:

 [self requestPingPongWithText:ping completion:^(const std::string &successString, const std::string &failureString) { if (!successString.empty()) { NSLog(@"block ping"); } else if (!failureString.empty()) { NSLog(@"block pong"); } }]; 

Я получаю следующую ошибку:

не может инициализировать параметр типа «OnComplete» (aka 'void (*) (const std :: string &, const std :: string &)') с rvalue типа 'void (^) (const std :: string & , const std :: string &) '

Как я могу решить эту ошибку?

Я не уверен, как вы можете использовать блоки здесь. Быстрая попытка не сработала слишком хорошо для меня. Однако вы можете использовать это (он использует мою оболочку objc_callback): [EDIT] он работает с блоками, если вы используете std :: function c ++ 11. См. Код ниже.

 #include <string> // #include <boost/function.hpp> // older c++ with boost #include <functional> // c++11 template<typename Signature> class objc_callback; template<typename R, typename... Ts> class objc_callback<R(Ts...)> { public: typedef R (*func)(id, SEL, Ts...); objc_callback(SEL sel, id obj) : sel_(sel) , obj_(obj) , fun_((func)[obj methodForSelector:sel]) { } inline R operator ()(Ts... vs) { return fun_(obj_, sel_, vs...); } private: SEL sel_; id obj_; func fun_; }; 

Надеюсь, вы сможете получить эту идею, если нет – спросите еще раз 🙂

 // your new callback type // boost variant: // typedef boost::function<void(const std::string&, const std::string&)> OnComplete; // c++11 variant typedef std::function<void(const std::string &, const std::string &)> OnComplete; // your test function static void myFunc(const std::string& text, OnComplete completion) { NSLog(@"Try to invoke callback for %s...", text.c_str()); completion("test", "no_fail"); NSLog(@"Invoked."); } - (void) funCallbackWithSuccess:(const std::string&)success andFail:(const std::string&)fail { NSLog(@"Called with %s and %s", success.c_str(), fail.c_str()); } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // objc_callback is the bridge between objective-c and c++ myFunc("soviet russia", objc_callback< void(const std::string&, const std::string&)>( @selector(funCallbackWithSuccess:andFail:), self ) ); // same thing but with blocks myFunc("soviet russia", ^(const std::string& success, const std::string& fail) { NSLog(@"Block called with %s and %s", success.c_str(), fail.c_str()); }); } 

Удачи.

  • Поверните предварительный просмотр камеры на портрет в iOS OpenCV Camera
  • Авторизация пользователя в приложении iOS
  • Переопределение кнопки IOS UIButtonPressed
  • Имя папки приложения меняется каждый раз, когда я запускаю симулятор
  • Не получить действие кнопки / Одиночный щелчок по настраиваемому вызову MKannotation
  • Доступ к объектам NSMutableArray для использования в TableView
  • Регулярное выражение NSString для извлечения отрицательных чисел как часть уравнения
  • Получить текущее местоположение с помощью CLLocationCoordinate2D
  • Миграция приложений между различными версиями iOS
  • NSMutableArray с ошибкой NSMutableSet в Xcode 5, которая компилируется в Xcode 4
  • Сохранить NSData всегда в одном файле
  • Давайте будем гением компьютера.