簡體   English   中英

找出C ++空指針的類型

[英]Find out Type of C++ Void Pointer

我有一個小問題:如何找出C ++指針的類型?

我經常在控制台程序中使用一個小函數來收集輸入,如下所示:

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

我想使用一個空指針創建一個通用形式,但是我不能使用一個空指針,所以我如何找出它的類型以便進行轉換呢?

自從我上次用C ++編碼以來已經很長時間了,但是...

您不能使用模板嗎?

你不能

但是,一種替代方法是取消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...
    }
}

您可能不需要使用可以將其轉換為正確類型的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);
}

void*所有數據具有的形式。 您無法“確定”它- 就是這樣,程序中的任何數據都是 void* 是的,根據設計,它們是內存的原始塊。

可以只使用void*對整個代碼進行編程。 幸運的是,C語言為您提供了更多便利 ,使您可以按原樣操作某些數據void* 但是,如果要使用此便利,則不應將它們強制轉換為void*並忘記它們的類型。

您的問題對我來說根本不清楚,但也許您想要的是重載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);

如果我了解您的要求,那么執行此操作的通常方法是創建一個支持query(string what-to-ask)的接口類,然后不使用空指針,而只需將指針傳遞給該接口即可。 然后,您可以在該實例上調用query()。

不。 你做不到 如果您需要這樣的東西,我建議使用Boost.Any

如果您自己控制數據類型,我可能會創建一個包含您關心的所有數據類型的枚舉的類/結構並將其傳遞。 然后,您可以查詢傳入的指針的數據類型,然后進行適當的轉換。

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

您可以將其讀取為char *,然后解析字符串(逐個char)以確定其是否為int,float,string等。 棘手的部分是對其進行轉換。

例如:

對於字符串中的每個字符

如果(字符是“。”)

++十進制計數

否則(字符是字母)

++字母計數

循環結束

如果十進制計數> 0 && lettercount == 0,則從右到左解析每個數字,乘以10的冪並加總和

否則,如果十進制計數== 1 &&字母計數== 0

了解浮點數如何用二進制表示,並找到其他人的函數為您轉換

否則,如果lettercount> 0

這是一個字符串。 好極了!

盡可能避免使用空指針,請使用模板。 我最近正在尋找具有大量void *的巨大代碼庫,這非常耗時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM