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()); }); } 

Удачи.

  • Как управлять всплывающим окном Copy & Paste UITextField?
  • Невозможно разобрать множественный ответ на iOS
  • Объявление 2D-массива в Objective-C ++ ошибке
  • Как прервать анимацию UIView
  • Как получить все значения из всех текстовых полей
  • Pebble смотреть приложение с помощью C. Проверьте подключение к Интернету?
  • Как можно корректно отобразить мой asp.NET на iPhone UIWebView?
  • Исправить UIView в нижней части экрана без автоматической компоновки
  • iOS 7 3.5 "против 4" смещение содержимого с экрана
  • Как управлять контроллерами представлений в appdelegate?
  • NSBundle pathForResource: возвращает nil
  • Interesting Posts

    Неправильное изменение ориентации iOS

    Приложение в портрете – модальный вид в ландшафте – нет авторотации

    Сохранять текущий список сообщений пользователя в сеансе с быстрым

    Выделение или увеличение выбранной ячейки?

    Добавление аргументов в UIAlertAction

    Реагировать на активных слушателей событий стека IOS

    Почему NavigationController не использует представление?

    Как обнаружить, когда доля Facebook была отменена с помощью UIActivityViewController setCompletionWithItemsHandler

    этот код действительно нуждается в «» в конце viewDidLoad (в UITableViewController)

    вызов метода цели c из файла javascript

    (Этот элемент не может быть разделен, выберите другой элемент). Разделение простого текста на то, что приложение не работает, так как обновлено до iOS 9.3 в Swift

    Как разместить четыре кнопки равномерно с помощью AutoLayout?

    Странное поведение UITextView в UITableViewCell

    iOS Universal Links иногда перестает работать

    Обнаружение автономного приложения и переход на него

    Давайте будем гением компьютера.