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’ (иначе void
(*) (const std :: string &, const std :: string &) ‘) со значением типа
‘void (^) (const std :: string &, const std :: string &)»

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

2

Решение

Я не уверен, как вы могли бы использовать блоки здесь. Быстрая попытка не сработала для меня. Однако вы можете использовать это (он использует мою оболочку 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());
});
}

Удачи.

2

Другие решения


По вопросам рекламы [email protected]