背景
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
一言
とてつもなく限定的で、コードが凄く見づらい。