Как да конвертирате VARIANT в цяло число

Преобразувам VARIANT в int, използвайки boost::lexical_cast, както е показано по-долу:

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

Но изглежда, че получавам ненужна стойност тук: id.intVal. Какво правя грешно тук?


person sohel14_cse_ju    schedule 18.09.2016    source източник
comment
моля, прегледайте този документ boost.org/doc/libs /1_55_0/doc/html/boost_lexical_cast/   -  person Joji Thomas Eapen    schedule 18.09.2016
comment
boost::lexical_cast няма полза от VARIANT. Каква е стойността на id.vt в този контекст?   -  person ildjarn    schedule 18.09.2016
comment
стойността е: id.vt 8   -  person sohel14_cse_ju    schedule 18.09.2016
comment
8 е VT_BSTR, така че опитайте component.m_id = boost::lexical_cast<int>(id.bstrVal);.   -  person ildjarn    schedule 18.09.2016


Отговори (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);
person Simon Mourier    schedule 18.09.2016

можете да използвате boost::get. Но не и за кастинг. Той е за извличане на реалния тип от 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::variant

person basslo    schedule 18.09.2016