我正在使用boost :: lexical_cast将VARIANT转换为int,如下所示:
component.m_id= boost::lexical_cast<int>(id.intVal);
但看起来我在这里得到了垃圾值:id.intVal。我在这做错了什么?
答案 0 :(得分:2)
如果您真的不知道变体的类型(在您的示例中,它似乎是一个表示为VT_BSTR的字符串),最好和最安全的方法是调用Windows API VariantChangeType (或VariantChangeTypeEx是本地化是一个问题);这是一个例子(不是特定于boost的):
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);
答案 1 :(得分:0)
你可以使用 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变种上设置的类型,你必须使用: boost :: apply_visitor&lt;&gt; ,如下面链接中的示例所示,页面末尾:
http://www.boost.org/doc/libs/1_61_0/doc/html/variant.html
但这意味着您必须为boost :: variant
中的每种类型执行此操作