如何将VARIANT转换为整数

时间:2016-09-18 08:49:40

标签: c++ c++11 com variant

我正在使用boost :: lexical_cast将VARIANT转换为int,如下所示:

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

但看起来我在这里得到了垃圾值:id.intVal。我在这做错了什么?

2 个答案:

答案 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

中的每种类型执行此操作