【问题标题】:How to convert VARIANT to integer如何将 VARIANT 转换为整数
【发布时间】:2017-01-26 02:48:26
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

如果您真的不知道变体的类型(在您的示例中,它似乎是一个表示为 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);

【讨论】:

    【解决方案2】:

    您可以使用 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,就像下面链接中的示例一样,在末尾页面:

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

    但这意味着您必须为 boost::variant 中的每种类型都这样做

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 2010-10-11
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 2011-04-04
      相关资源
      最近更新 更多