[英]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.