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()返回 aconst 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 回答