2016-09-18 30 views
0

我將VARIANT使用boost :: lexical_cast的,如下爲int:如何轉換VARIANT整數

component.m_id= boost::lexical_cast<int>(id.intVal); 

不過貌似我在這裏獲得垃圾值:id.intVal。我在這裏做錯了什麼?

+0

請到通過這個文件http://www.boost.org/doc/libs/1_55_0/doc/ html/boost_lexical_cast/examples.html –

+1

'boost :: lexical_cast'對'VARIANT'沒有用處。在這種情況下'id.vt'的價值是什麼? – ildjarn

+0

值爲:id.vt 8 –

回答

2

如果你真的不知道該變種所持有的類型(在你的例子中,它似乎是一個表示爲VT_BSTR的字符串),最好和最安全的方法是調用Windows API VariantChangeType(或VariantChangeTypeEx本地化是一個問題);這裏有一個例子(提高特異性不):

VARIANT vIn; 
VariantInit(&vIn); 
vIn.vt = VT_BSTR; 
vIn.bstrVal = ::SysAllocString(L"12345678"); 

VARIANT vOut; 
VariantInit(&vOut); 

// convert the input variant into a 32-bit integer 
// this works also for other compatible types, not only BSTR 
if (S_OK == VariantChangeType(&vOut, &vIn, 0, VT_I4)) 
{ 
    // now, you can safely use the intVal member 
    printf("out int: %i\n", vOut.intVal); 
}  

VariantClear(&vOut); 
VariantClear(&vIn); 
0

可以使用的boost ::得到。但不適用於鑄造。它用於從boost :: variant中提取真實類型。例如: 假設你有:

boost::variant<bool, int, double> v myVariant; 
myVariant = true; 

,你必須使用:

bool value = boost::get<bool>(myVariant); 

,而不是

double value = boost::get<double>(myVariant); 

否則會崩潰。

一旦你有了值,你可以施放它。

如果你不知道你設置你提高變異的類型,你必須使用:的boost :: apply_visitor的<>像在下面的鏈接的例子,在頁面的末尾:

http://www.boost.org/doc/libs/1_61_0/doc/html/variant.html

不過這意味着你必須這樣做,對每種類型在你的boost ::變種