2015-05-18 103 views
1

我想知道我怎麼可以做以下的C#代碼在C++空類檢索的基本類型

object data; 
private T GetJsonData<T>(String node) 
{ 
    Type type=typeof(T); 
    Type nType=Nullable.GetUnderlyingType(type); 
    if(null!=nType) 
    { 
     if(node=="") 
     return default(T); 
     return (T)Convert.ChangeType(data,nType); 
    } 
} 

我覺得std命名空間應該有一些類似的方法可以做同樣的,但我不能找一個例子來做一些如上所述的事情。

+0

我推薦閱讀[如何問](http://stackoverflow.com/help/how-to-ask),告訴我們至少你到目前爲止所嘗試過的以及你在哪裏奮鬥。 –

+0

C++沒有這種由c#提供的類型反射。最接近的想法是[type traits](http://en.cppreference.com/w/cpp/types)恕我直言。 –

+0

@πάνταῥεῖ不,這是可行的:基本類型(int,long,...)的模板專門化,然後對於其他類型,執行'Convert.ChangeType'的操作:創建和使用類似' IConvertible',類型'T'必須有,並且解析字符串......考慮如何在C++中完成模板,您甚至不需要該接口。你可以直接使用'T T.Parse(std:string)'方法 – xanatos

回答

1

恕我直言,給定的代碼不能直接轉換成C++,因爲既沒有中央轉換類也沒有可能檢查一個類型是否可以有nullptr值。你自己輕鬆

http://www.cplusplus.com/reference/type_traits/

您可以構建一個nullptr檢查與功能overloding:當然,你可以建立你自己的使用力學兩個行爲樣型性狀

inline bool canbeNULL(bool){return false;} 
inline bool canbeNULL(int *){return true;} 
// and all others... 

上面的代碼會看起來像:

T dummy; 
if(canbeNULL(dummy)) 
{ 
    // do what you have to do 
} 

您還可以包裝不同的對話功能int自己Convert cla ss使用方法重載。

在您的示例中,您使用將JSON轉換爲C++對象的函數。 AS JSON只有幾種不同的類型,我會用函數重載來解決你的問題。作爲函數重載不與返回類型的工作,你必須給返回類型爲參數,如:

void GetJsonData(std::string strin, bool &returnvalue) {do the stuff} 
void GetJsonData(std::string strin, int &returnvalue) {do the stuff} 
void GetJsonData(std::string strin, double &returnvalue) {do the stuff} 
// and more... 

這種方式,你可以使用函數模板內,該模板將解析正確調用本身。