在C++中存储类型

per*_*iae 29 c++ types casting

是否可以将类型名称存储为C++变量?例如,像这样:

type my_type = int; // or string, or Foo, or any other type
void* data = ...;
my_type* a = (my_type*) data;
Run Code Online (Sandbox Code Playgroud)

我知道有99.9%的时间有更好的方法来做你想做的事情而不需要使用无效指针,但我很好奇C++是否允许这样的事情.

Tho*_*mas 24

不,这在C++中是不可能的.

RTTI typeid运算符允许您在运行时获取有关类型的一些信息:您可以获取类型的名称并检查它是否等于另一种类型,但这是关于它的.

  • 它是便携式的,不在编译器之间.在Linux上使用GCC编译的应用程序将具有与Windows上的GCC相同的类型名称,但与VS编译器不同. (11认同)

Mic*_*yan 16

不是写的,但你可以做类似的事情......

class Type
{
    public:
        virtual ~Type(){}
        virtual void* allocate()const=0;
        virtual void* cast(void* obj)const=0;
};

template<typename T> class TypeImpl : public Type
{
      public:
         virtual void* allocate()const{ return new T; }
         virtual void* cast(void* obj)const{ return static_cast<T*>(obj); }
};

// ...
Type* type = new TypeImpl<int>;
void* myint = type->allocate();
// ...
Run Code Online (Sandbox Code Playgroud)

根据您需要的功能,可以扩展此类功能.

  • 方法“cast”在这里实现了什么?它仅返回一个“void*”指针,在使用该指针之前必须将其显式“static_cast&lt;T*&gt;”指向特定类。 (2认同)

Chr*_*s H 9

您无法在C++中执行此操作,但您可以使用boost任何库,然后测试它所拥有的类型.例:

bool is_int(const boost::any & operand)
{
  return operand.type() == typeid(int);
}
Run Code Online (Sandbox Code Playgroud)

http://www.boost.org/doc/libs/1_42_0/doc/html/any/s02.html

  • Boost 并不神奇,如果他们可以用 C++ 做到这一点,你也可以用 C++ 做到这一点,只是可能并不容易。 (2认同)

Bri*_*ndy 6

不,你不能直接存储类型,但你可以存储类型的名称.

const char* str = typeid(int).name();
Run Code Online (Sandbox Code Playgroud)

我想无论何时你打算使用那个变量进行比较,你都可以在那时将str变量与name()类型进行比较.

const char* myType = typeid(int).name();

//....

//Some time later:
if(!strcmp(myType, typeid(int).name()))
{
  //Do something
}
Run Code Online (Sandbox Code Playgroud)

这里有更多信息

  • @Michael:我没有建议将其保存到文件中 (7认同)