ゆとりーなの日記

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

Objective-Cとtype_traits

 Objective-Cとtype_traitsで遊んでみました。環境はApple clang version 2.1の-std=c++0x -stdlib=libc++付きです。

Objective-C的継承

 NSObjectとNSStringはtype_traits的に継承関係とみなされるかどうかです。

#import <iostream>
#import <type_traits>
#import <Foundation/Foundation.h>

int main() {
  std::cout << std::is_base_of<NSObject, NSString>::value << std::endl;
  return 0;
}

出力

0

 みなされませんでした。

#import <iostream>
#import <type_traits>
#import <Foundation/Foundation.h>

int main() {
  std::cout << std::is_convertible<NSString *, NSObject *>::value << std::endl;
  return 0;
}

出力

1

 派生クラスのポインタから基底クラスのポインタへは変換可能と判定されました。

id型

 id型とはtype_traits的には何者なのでしょうか。

#import <iostream>
#import <type_traits>
#import <Foundation/Foundation.h>

int main() {
  std::cout << std::is_pointer<id>::value << std::endl;
  return 0;
}

出力

1

 ポインタでした。

ブロック

 blockとはtype_traits的には何者なのでしょうか。

#import <iostream>
#import <type_traits>
#import <Foundation/Foundation.h>

int main() {
  typedef void (^block_t)();
  std::cout << std::is_pointer<block_t>::value << std::endl;
  return 0;
}

出力

0

 ポインタではありませんでした。

Objective-Cオブジェクト

 Objective-Cオブジェクトとはtype_traits的には何者なのでしょうか。

#import <iostream>
#import <type_traits>
#import <Foundation/Foundation.h>

int main() {
  std::cout << std::is_polymorphic<NSString>::value << std::endl;
  return 0;
}

出力

0

 Objective-Cのメソッドは普通に仮想函数とは別物でした。

#import <iostream>
#import <type_traits>
#import <Foundation/Foundation.h>

int main() {
  std::cout << std::is_default_constructible<NSString>::value << std::endl;
  return 0;
}

出力

1

 デフォルトコンストラクタで構築できるようです。NSString str;みたいな書き方はできないのでこれには何か違和感がありますが構築できない理由がまたあれなのでそういうことなのでしょう。


 とりあえずこれは現状試してみたらこうなった的なものなので規格とかでどうなっているかとかはよく分かりませんので悪しからず。