找出C++ Void Pointer的类型

new*_*456 9 c++ casting void-pointers

我有一个小问题:如何找出C++指针的类型?

我经常在我的控制台程序中使用一个小函数来收集输入,看起来像这样:

void query(string what-to-ask, [insert datatype here] * input)
Run Code Online (Sandbox Code Playgroud)

我想创建一个泛型表单,使用void指针,但我不能cin一个void指针,所以如何找出它的类型,所以我可以投射它?

Bru*_*eis 15

自从我上次用C++编写代码以来已经很长时间了,但......

你不能使用模板吗?

  • OP正在寻找RTTI,这不适用于void*.模板就是答案. (2认同)

asv*_*kau 10

你不能.

但是,一种替代方法是取消void指针,使所有内容都从公共基类派生并使用RTTI.

一个例子:

class Base
{
public:
   virtual ~Base() {}
};

class Foo : public Base { /* ... */ };

void SomeFunction(Base *obj)
{
    Foo *p = dynamic_cast<Foo*>(obj);
    if (p)
    {
        // This is of type Foo, do something with it...
    }
}
Run Code Online (Sandbox Code Playgroud)


sth*_*sth 6

与其传递 a void*,然后您需要将其强制转换为正确的类型,您应该使用一个模板函数,该函数可用于您想要读取的所有类型。

通过这种方式,您可以获得类型安全的代码,而不必为大多数输入类型编写特殊代码:

template<typename T>
void query(const string &whattoask, T &input) {
  cout << whattoask << endl;
  cin >> input;
  cout << endl;
}

int main() {
  int i;
  double d;
  string s;

  query("An integer: ", i);
  query("Floating point: ", d);
  query("A word: ", s);
}
Run Code Online (Sandbox Code Playgroud)


Aar*_*ron 0

如果我理解您的要求,那么通常的方法是创建一个支持的接口类query(string what-to-ask),然后不使用 void 指针,而是将指针传递给接口。然后您可以在该实例上调用 query()。