Преобразувам VARIANT в int, използвайки boost::lexical_cast, както е показано по-долу:
component.m_id= boost::lexical_cast<int>(id.intVal);
Но изглежда, че получавам ненужна стойност тук: id.intVal. Какво правя грешно тук?
Преобразувам VARIANT в int, използвайки boost::lexical_cast, както е показано по-долу:
component.m_id= boost::lexical_cast<int>(id.intVal);
Но изглежда, че получавам ненужна стойност тук: id.intVal. Какво правя грешно тук?
Ако наистина не знаете типа на това, което съдържа вариантът (във вашия пример изглежда, че е низ, представен като 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);
можете да използвате 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
boost::lexical_cast
няма полза отVARIANT
. Каква е стойността наid.vt
в този контекст? - person ildjarn   schedule 18.09.20168
еVT_BSTR
, така че опитайтеcomponent.m_id = boost::lexical_cast<int>(id.bstrVal);
. - person ildjarn   schedule 18.09.2016