LoginSignup
3
4

More than 5 years have passed since last update.

C++のlambdaをObjective-Cのblockに渡して呼び出す。

Last updated at Posted at 2015-12-05

背景

C++で書いたlambdaを、Objective-Cで書かれたクラスのインスタンスメソッドに渡し、呼び出したい場面があったので書いてみた。

例として、「hello world.」を合わせて2つの言語で実装してみた。

実装例

main.cpp
#include <iostream>
#include "objectC.h"
int main(int argc, const char * argv[]) {
    objectC* obj = new objectC();
    obj->say([](){
        std::cout << "world." << std::end;
    });
    return 0;
}

みんな大好きmain部分。
objectCのインスタンスを作って、sayにlambdaを渡してるだけです。

objectC.h
#include <iostream>
class objectC {
public:
    void say(const std::function<void()>& func);
};

普通過ぎて特に書く事ナシ

objectC.mm
#include "objectC.h"
#import <Foundation/Foundation.h>

@interface object : NSObject
- (void)say:(void (^)()) block;
@end

@implementation object
- (void)say:(void (^)()) block {
    NSLog(@"hello");
    block();
}
@end

void objectC::say(const std::function<void()>& func) {
    auto test = [[object alloc] init];
    [test say:^(){
        func();
    }];
}

.mmの拡張子ならば、Objective-CとC++が混合して実装出来る(.mや.cppだとダメ)

コードはシンプルで、C++で書かれたsayで受け取ったlambdaを
そのままObjective-Cで書かれたクラスのインスタンスメソッドの引数に投げてるだけ。

実行すると?

Console
2015-12-05 21:05:19.084 objectivec[58931:27858894] hello
world.
Program ended with exit code: 0

一言

とてつもなく限定的で、コードが凄く見づらい。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4