3

type_info オブジェクトを作成して保存しようとしています:

#include <typeinfo>
int i;
type_info x = typeid(i);

そして、エラーメッセージが生成されます。type_info オブジェクトを格納する方法はありますか?

この背後にある歴史は、さまざまな C++ 整数型のテスト ケースを生成しようとしているということです。それらに対して算術演算を実行し、中間結果を次に大きな整数型に昇格するか切り捨てるかを決定します。あれは:

unsigned char x = 257;
unsigned char y = 257;
// is (x + y) == 514 or 256?

そして、静的データ構造に対して型チェックを行うことにしました。次に例を示します。

int x = <value>;
int y = <value>;
static type_info def = { typeid(bool)
                       , typeid(char),  typeid(unsigned char)
                       , typeid(short), typeid(unsigned short)
                       , typeid(long),  typeid(unsigned long)
                       };
type_info obj = typeid(x + y);
for(int i = 0; i < sizeof(def)/sizeof(def[0]); i++) if (obj == def[i]); break;

いずれにせよ、type_info 構造体を格納できなければできないので、整数の昇格について知りたいと思っています。

type_info オブジェクトを作成できますか? gcc 4.5.3 実装には、プライベートとしての割り当てがあります。

整数の昇格がいつ実行されるかを示すリソースはありますか?

ありがとう

4

2 に答える 2

5

typeid()を返し、プライベート コピー コンストラクターconst type_info &type_info持っているため、記述した配列を構築することはできません。それらが永続的であるかどうかは何も言えませんが、試してみてくださいtype_info *a[] = { &typeid(int), ... }

于 2012-12-17T01:12:34.270 に答える
0

C++11 では (gcc 4.5.1 で動作します)、次のようなことが動作する可能性があります。

#include <type_traits>

template<typename... Types>
struct Seq {};

template<typename T, typename Seq, typename=void>
struct IndexOf;

template<typename T, typename First, typename... Types>
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< std::is_same<T, First>::value >::type > {
  enum { value = 0 };
};
template<typename T, typename First, typename... Types>
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< !std::is_same<T, First>::value >::type > {
  enum { value = 1+IndexOf<T,Seq<Types...>>::value };
};

typedef Seq< bool, char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long > IntegerTypes;

#include <iostream>

int main() {
  int x = 7;
  int y = 10;
  std::cout << IndexOf< decltype(x+y), IntegerTypes >::value << "\n";
  // this next line will not compile, because void is not in the IntegerTypes sequence:
  // std::cout << IndexOf< void, IntegerTypes >::value << "\n";
}

ただし、x または y の値には依存せず、それらの型だけに依存することに注意してください。

すべてのロジックは、実行時ではなくコンパイル時に行われることに注意してください。また、リストにない型を渡すと、大量のエラー メッセージが表示されます (適切な解釈は「見つかりません」です)。エラー メッセージを短くすることもできたのですが、面倒です。:)

于 2012-12-17T00:51:48.157 に答える