ゆとりーなの日記

日記的な事を書いて行くと思はれる

あいぽんでtype_traits使ったよ

 Objective-Cにはオブジェクトが指定したクラスか派生クラスかを調べるメソッドがあったりしますが、これをC++っぽいキャストとして作ってしまおうという話です。使いかたとしてはこんな感じです。丁度dynamic_castのObjective-C版みたいな雰囲気です。

void foo(id object) {
  // objectがNSStringかNSStringの派生クラスでなければstringにはnilが返る
  const auto string = objective_cast<NSString *>(object);
}

 で、実装ですが、isKindOfClassメソッドを使い、YESが返ってくればそのまま通し、NOが返ってくればnilを返すという感じにします。

template <typename Target>
Target objective_cast(id src) {
  return [src isKindOfClass:[型名 class]] ? src : nil;
}

 ここで、型名ってのがポインタではないので、Targetから*を取っ払はなければなりません。ここでremove_pointerの出番じゃないですか。

template <typename Target>
Target objective_cast(id src) {
  return [src isKindOfClass:[typename boost::remove_pointer<Target>::type class]] ? src : nil;
}

 残念ながら現状iPhone向けにはlibc++が使えないようなので、boostの方を使っておきました。type_traitsとかiPhoneとかでは使わんだろとか思ってましたが普通に使いどころはありましたという話です。