首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C++函数封装为块

将C++函数封装为块
EN

Stack Overflow用户
提问于 2014-06-30 16:03:43
回答 1查看 258关注 0票数 2

在我的应用程序中,我有一个C++类和一个Objective类,它们一起工作的方式如下:

PingPong.h

代码语言:javascript
复制
#ifndef __RSSCPPCallbackTest__PingPong__h
#define __RSSCPPCallbackTest__PingPong__h

#include <iostream>

class PingPong
{
public:
    static void requestPingPongWithText(std::string text);
    static void eventRequestPingPongWithTextSuccess(std::string successString);
    static void eventRequestPingPongWithTextFailure(std::string failureString);
};

#endif

PingPong.cpp

代码语言:javascript
复制
#ifndef __RSSCPPCallbackTest__PingPong__m
#define __RSSCPPCallbackTest__PingPong__m

#include "PingPong.h"

void PingPong::requestPingPongWithText(std::string text)
{
    if (text.compare("ping") == 0)
    {
        PingPong::eventRequestPingPongWithTextSuccess("success ping");
    }
    else
    {
        PingPong::eventRequestPingPongWithTextFailure("failure pong");
    }
}

#endif

目标-C类: MainViewController.mm

代码语言:javascript
复制
@implementation MainViewController

        /* init, viewDidLoad, etc... */

        // Call ping with a button
        - (IBAction)sayPing:(id)sender {

            NSString *text = @"ping";

            PingPong::requestPingPongWithText([text UTF8String]);
        }

        // Call pong with another button
        - (IBAction)sayPong:(id)sender {

            NSString *text = @"pong";

            PingPong::requestPingPongWithText([text UTF8String]);
        }    

@end

        void PingPong::eventRequestPingPongWithTextSuccess(std::string successString)
        {
            NSLog(@"successString: %@", [NSString stringWithCString:successString.c_str()
                                                           encoding:[NSString defaultCStringEncoding]]);
        }
        void PingPong::eventRequestPingPongWithTextFailure(std::string failureString)
        {
            NSLog(@"failureString: %@", [NSString stringWithCString:failureString.c_str()
                                                           encoding:[NSString defaultCStringEncoding]]);
        }

这个很好用。最后,我要做的是将它包装成一个函数,其中包含如下所示的完成块:

代码语言:javascript
复制
    [self requestPingPongWithText: text
    completion:^(NSString *successString, NSString *failureString)) completion {
     if (successString) {
NSLog(@"successString: %@", successString); } 
    else if (failureString) { 
NSLog(@"failureString: %@", failureString); }
    }];

我如何包装我现有的代码,使函数如上面所示?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-30 18:31:38

让我们在Lets Pong.h中做一个新的类型:

typedef void (^OnComplete)(std::string successString, std::string failureString);

按块为请求创建一个新方法:

代码语言:javascript
复制
static void requestPingPongWithBlock(std:string text, OnComplete block);

另一种方法是,将其明确化:

代码语言:javascript
复制
static void requestPingPongWithBlock(std:string text, void (^block)(std::string successString, std::string failureString));

在PingPong.cpp中实现:

代码语言:javascript
复制
void PingPong::requestPingPongWithBlock(std::string text, OnComplete block)
{
    if (text.compare("ping") == 0)
    {
        block("success ping", "");
    }
    else
    {
        block("", "failure pong");
    }   
}

在MainViewController.mm中

代码语言:javascript
复制
-(void)requestPingPongWithText:(NSString*)text completion:(OnComplete) compblock{
    PingPong::requestPingPongWithBlock([text UTF8String],compblock);
}

你可以这样称呼它:

代码语言:javascript
复制
[self requestPingPongWithText: text
                   completion:^(std::string successString, std::string failureString) {
                       if (successString.length() != 0) {
                           NSLog([NSString stringWithUTF8String: successString.c_str()]); }
                       else if (failureString.length() != 0) {
                           NSLog([NSString stringWithUTF8String: failureString.c_str()]); }
                   }];

我希望这是有帮助的;)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24494361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档