找出C ++ Void Pointer的类型

时间:2009-11-11 22:10:23

标签: c++ void-pointers casting

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

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

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

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

10 个答案:

答案 0 :(得分:15)

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

你不能使用Template吗?

答案 1 :(得分:9)

你不能。

但是,另一种方法是废除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...
    }
}

答案 2 :(得分:4)

您可能应该使用可以与您想要阅读的所有类型一起使用的模板函数,而不是传递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);
}

答案 3 :(得分:2)

void*所有数据的格式。您无法“确定”它 - 它,您在程序中拥有的任何数据都是 void*!是的,根据设计,它们是原始的记忆块。

可以仅使用void*编写整个代码。幸运的是,C语言为您提供了额外的便利,让您可以操纵一些数据,因为它们不是void*。但是如果你打算使用这种方便,你不应该将它们转换为void*而忘记它们的类型。

答案 4 :(得分: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);

答案 5 :(得分:0)

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

答案 6 :(得分:0)

不。你不能这样做。如果你需要这样的话,我建议Boost.Any

答案 7 :(得分:0)

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

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.
    }
}

答案 8 :(得分:0)

您可以将其作为char *读取,然后解析字符串(char by char)以确定它是int,float,string等等。棘手的部分是转换它。

例如:

表示字符串

中的每个字符

if(字符是'。')

++ decimalcount

否则if(字符是一个字母)

++ lettercount

结束循环

if decimalcount&gt; 0&amp;&amp; lettercount == 0   从右到左解析每个数字,乘以10的幂并加上总和

否则,如果decimalcount == 1&amp;&amp; lettercount == 0

了解浮点数如何用二进制表示,并找到别人的函数来为你转换它

否则,如果是lettercount&gt; 0

这是一个字符串。耶!

答案 9 :(得分:0)

尽可能避免使用空指针,请使用模板。我最近正在寻找具有大量void *的巨大代码库,这非常耗时。