Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

@encodeにテンプレート引数を使う

タグ: Objective-C C++

構造体からNSValueを作るときにいちいちobjCType:を指定するのが面倒。
もし、@encodeの型指定にテンプレート引数を使えるなら、

#include <string.h>
#include <typeinfo>
#import <Foundation/Foundation.h>

template <typename T>
inline NSValue* make_value(const T& source)
{
    return [NSValue valueWithBytes:&source objCType:@encode(T)];
}

template <typename T>
inline T value_cast(NSValue* value)
{
    if(strcmp([value objCType], @encode(T)) != 0)
        throw std::bad_cast(); // Objective-C例外の方が望ましい?
    T res;
    [value getValue:&res];
    return res;
}

struct Structure
{
    unsigned short n1;
    char n2;
    int n3;
};

void test()
{
    Structure hoge;
    hoge.n1 = 1;
    hoge.n2 = 10;
    hoge.n3 = 100;
    NSValue* value = make_value(hoge);
    
    Structure fuga = value_cast<Structure>(value);
    NSLog(@"%s %d %d %d", [value objCType], fuga.n1, fuga.n2, fuga.n3);
}

こうBoost.Anyみたいに書けて楽なんだが。
さすがにCのsizeof()演算子の引数として使用できる任意の型に「C++のテンプレート仮引数」を指定するのは無茶かと……

{Structure=Sci} 1 10 100

別にそんなことはなかった。
侮れんな、Objective-C++。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/199-e8730823
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。