Objective-C++

.mmソースファイル内でBoost.Spirit.Qiを使う

Boost.Spirit.Qiの内部でnilという名前のクラスが使われているので、Objective-C++の文脈(.mm拡張子のソースファイルや、.mmでインクルードされる.h)でこれを使おうとすると、Objective-Cのnilキーワードと衝突してコンパイルエラーになります。 このため、B…

非Objective-Cオブジェクトを引数として渡す

NSObjectのperformSelectorは、Objective-Cのオブジェクトしか渡せないので、int型の値を渡すだけでもたいへんです。NSObjectを継承したInteger型みたいなのを作るか、NSValueを使っているひとが多いと思います。 今回は、intでもstd::vectorでも、C++のオブ…

iPhone開発でboost::shared_ptrを使う方法

id:melpon が書かないので代わりに書いちゃいます。 boost::shared_ptrは、環境によってはスレッドセーフなアクセスを行う処理のあたりで インラインアセンブラを使ってるのでiPhone開発で使おうとするとコンパイルエラーになってしまいます。 なので、<boo…

Objective-Cのクラスを名前空間っぽく使う

Objective-Cには名前空間がないので @interface HogeView ... @end struct Hoge { typedef HogeView View; }; みたいに書けば Hoge::View* view = [[Hoge::View alloc] initWithFrame:[window frame]]; 名前空間っぽく書けるなー、というのを今思いついた。

Objective-CでC++のコンストラクタとデストラクタが呼ばれるようにする方法

Xcode(GCC)には、「Call C++ Default Ctors/Dtors in Objective-C」というオプションがあります。 これを ON にすると、 Objective-C のクラスメンバに C++ クラスオブジェクトを持ったときに C++ クラスオブジェクトのコンストラクタとデストラクタが呼ばれ…

Objective-CのクラスをC++でラップする方法

Objective-C と C++ のコードは、 *.mm 形式のファイルの中では混在させることができます。なので、 Objective-C のライブラリを C++ でラップしてしまえば、ほとんどが C++ で組めるようになります。 以下はその方法 *.h では混在コードを書けないので、 C+…

std::stringからNSStringへの変換

inline NSString* toNSString(const std::string& s) { return [[[NSString alloc] initWithCString:s.c_str() encoding:NSUTF8StringEncoding] autorelease]; } # はてなのスーパーpre記法に「objcpp」があったりします