簡體   English   中英

使用static_cast檢查void * to Object是否成功

[英]Check if void* to Object with static_cast is successful

我正在開發一個將從C#調用的C ++插件。 我試圖移植的API帶有數百個函數,其中大多數只是具有相同名稱但具有不同數據類型(如intfloatchar重載。

我不是一遍又一遍地在C ++和C#端編寫相同的代碼但是使用不同的數據類型,而是希望使用通用指針對它進行一次函數重載。 我的目標是使用static_castvoid*intfloat然后char和使用哪一個是第一個成功。

一個來自C ++方面的簡單測試函數:

void calculate(void* input1, void* input2)
{
    float *i1 = static_cast<float*>(input1);
    if(i1==NULL)
    std::cout<<"Bad"<<std::endl;
    else
    std::cout<<*i1<<std::endl;
}

int main()
{
   int input1 = 5;
   int input2 = 10;

   calculate(&input1,&input2);

   return 0;
}

這應該輸出“BAD”,但似乎顯示“7.00649e-45”,我認為這是一種未定義的行為。 static_cast失敗了,我不知道如何檢查它是否成功。 在這種情況下,檢查它是否為NULL沒有幫助。

是否可以通過static_cast檢查對象的void*是否成功? 如果是這樣,怎么樣?

注意

這不是這個問題的重復。 我不想從void*找出Object的類型。 我只想檢查轉換或static_cast是否成功。 而已。

使用static_cast來恢復函數參數的類型是不合適的,因為轉換將在編譯時從void*float* 由於存在這種類型的轉換鏈,編譯器不會抱怨並且在執行期間,即使不能保證其結果,轉換本身也不會失敗。

這同樣適用於在調用calculate函數時從int*void*的轉換。

也許對於這種情況,您可以考慮使用模板函數來利用C ++的元編程功能。

這是一個剪輯開始:

template <class T*>
void calculate(T* a, T* b) {
    // your implementation here
}

編輯

如果你需要只為幾種類型導出模板函數,比如int,float,double等,你可以考慮在你的庫的一個cpp文件中為每個類型添加一個模板專門化,其中包含模板功能所在的頭部。聲明。

這是int*類型的示例。

   template __declspec(dllexport) calculate<int*>(int* a, int* b);

static_cast執行類型檢查,不能用於可靠地檢索類型。 此外,傳遞給您的函數的是void*指針,此時類型信息將丟失,甚至dynamic_cast也不會有幫助。 因此,即使在純C ++中,如果沒有模板,這也是一個難以解決的問題。 void*指針實際上是C# System.IntPtr這一事實使問題復雜化,據我所知,沒有足夠強大的互操作層來檢索原始類型(即使是原始類型)。

像這樣的問題是為什么像cog這樣的樣板代碼生成器被發明了。 有很多他們在那里,你可能想做一些研究,找到最適合你的需求。 Cog的工作原理是插入嵌入在C ++(或C#或其他)文件中的代碼生成腳本,並將其注入到構建過程中。 您可能會發現(相對較小的)時間投資(與手動生成樣板代碼相比)。

暫無
暫無

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

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