afaikの場合、バイナリにその情報を書き込む必要があります。構造体のsizeofとalignofを返す関数を作成し、サポートしなければならない型をサポートしてから、その関数(またはクラスメソッド)を呼び出します。
以下のプログラムは、多くのプリミティブがただ1文字であることを示しています。したがって、関数の実装の大半はスイッチになる可能性があります。
static void test(SEL sel) {
Method method = class_getInstanceMethod([NSString class], sel);
const char* const type = method_copyReturnType(method);
printf("%s : %s\n", NSStringFromSelector(sel).UTF8String, type);
free((void*)type);
}
int main(int argc, char *argv[]) {
@autoreleasepool {
test(@selector(init));
test(@selector(superclass));
test(@selector(isEqual:));
test(@selector(length));
return 0;
}
}
、あなたはその後、出発点としてこれを使用することができます:
typedef struct t_pair_alignof_sizeof {
size_t align;
size_t size;
} t_pair_alignof_sizeof;
static t_pair_alignof_sizeof MakeAlignOfSizeOf(size_t align, size_t size) {
t_pair_alignof_sizeof ret = {align, size};
return ret;
}
static t_pair_alignof_sizeof test2(SEL sel) {
Method method = class_getInstanceMethod([NSString class], sel);
const char* const type = method_copyReturnType(method);
const size_t length = strlen(type);
if (1U == length) {
switch (type[0]) {
case '@' :
return MakeAlignOfSizeOf(__alignof__(id), sizeof(id));
case '#' :
return MakeAlignOfSizeOf(__alignof__(Class), sizeof(Class));
case 'c' :
return MakeAlignOfSizeOf(__alignof__(signed char), sizeof(signed char));
...
したがって、答えは:自分で実装することなくこれを行う方法はありません。正しい? –
@Tilo私は実行時にいくつかばかげたことをしました。私が知っている無料の解決策はありませんが、サポートする必要があるタイプが分かっていれば、私の答えの解決策は簡単に実装できます。もちろん、より適切な回答が得られるかどうかを待つこともできます。 – justin
@Tilo - このデモを追加しました – justin