10

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

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

void query(string what-to-ask, [insert datatype here] * input)

我想创建一个通用表单,使用 void 指针,但我不能 cin 一个 void 指针,那么如何找出它的类型以便我可以转换它?

4

7 回答 7

12

你不能。

但是,一种替代方法是取消 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...
    }
}
于 2009-11-11T22:16:37.747 回答
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);
}
于 2009-11-11T22:30:50.077 回答
2

void*所有数据的形式。您无法“确定”它-就是它,您在程序中拥有的任何数据都是 void*!是的,按照设计,它们是原始的内存块。

可以使用void*only 来编写整个代码。幸运的是,C 语言为您提供了额外的便利,让您可以按原样操作一些数据void*。但是,如果您要使用这种便利,则不应将它们转换为void*并忘记它们是什么类型。

于 2009-11-11T22:18:46.447 回答
2

你的问题对我来说根本不清楚,但也许你想要的是超载query

void query(string what2ask, int* input) {
   cout << what2ask;
   cin >> *input;
}


void query(string what2ask, float* input) {
   cout << what2ask;
   cin >> *input;
}

int age;
float sqrt2;
query("How old are you?", &age);
query("What's the square root of 2?", &sqrt2);
于 2009-11-11T22:20:10.927 回答
1

如果您自己控制数据类型,我可能会创建一个类/结构,其中包含您关心的所有数据类型的枚举并传递它。然后,您可以查询传入的指针的数据类型,然后进行适当的转换。

IE(伪代码警告 - 现在将其视为结构。)

class MyDataType {
     enum aDataType type;
     void * myData;
}

void query( string whatToAsk, MyDataType * pdata)
{
    switch ( pdata.type) {
        case integer:
              int * workInt = (int * )  pdata;
              do whatever you want to to get the data
              break;
        case someFunkyObject:
              someFunkyObject pob = (SomeFunkyObject *) pdata;
              Do whatever you want with the data.

        etc.
    }
}
于 2009-11-11T22:23:38.790 回答
0

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

于 2009-11-11T22:16:37.090 回答
0

没有。你不能这样做。如果你需要这样的东西,我建议Boost.Any

于 2009-11-11T22:17:58.567 回答