【问题标题】:conversion between std::vector and _variant_tstd::vector 和 _variant_t 之间的转换
【发布时间】:2011-11-07 20:13:44
【问题描述】:

我需要在std::vector_variant_t 之间进行转换,以避免在将数据写入/发送到某个文件(数据库、Excel 等)时出现循环

您能告诉我如何处理吗?

我试图获得一个 std::vector<_variant_t> 并以某种方式放入另一个 _variant_t 变量,但不支持直接转换,即使完成了也没有任何方法或某种包装器可以将此向量放入 @987654325 @变量。

我不想处理任何循环。

【问题讨论】:

  • 你真的是指std::vector吗?还是你的意思是std::vector<T>
  • 为什么会有循环恐惧症?你应该正确地序列化你的向量 data 而不是试图将整个对象塞进其他类型;如果这是通过循环完成的,那就这样吧(尽管通常不需要这样)。
  • 您的std::vector 实际持有什么?您需要转换成什么_variant_t 数据类型?请提供更多详细信息。
  • 谢谢大家的回复!

标签: c++ com variant stdvector


【解决方案1】:

std::vector_variant_t 是不兼容的类型。 _variant_t 类型旨在支持 COM 接口需要支持相同参数的多种类型值的场景。它的值集仅限于 COM 了解如何编组的值。 std::vectory 不是这些类型之一。

将值集合存储到_variant_t 的标准方法是将其作为安全数组进行。因此,最简单的解决方案是将 std::vector 转换为安全数组并将其存储在变体中。这里真的没有办法避免循环

// Convert to a safe array
CComSafeArary<INT> safeArray;
std::vector<int> col = ...;
for (std::vector<int>::const_iteator it = col.begin(); it != col.end(); it++) {
  safeArray.Add(*it);
}

// Initialize the variant
VARIANT vt;
VariantInit(&vt);
vt.vt = VT_ARRAY | VT_INT;
vt.parray = safeArray.Detach();

// Create the _variant_t
_variant_t variant;
variant.Attach(vt);

【讨论】:

  • 非常感谢您的回答!在我之前的问题stackoverflow.com/questions/6943360/… 中,我设法通过将 _vartiant_t 对象转换为常规双 std::vector 来避免循环。有没有类似的技巧可以在这里使用?我问这个的原因是我对 SafeArray-s 不太熟悉,所以不幸的是我不知道是否可以像以前一样使用迭代器。
  • @Anthony 我不相信有。
  • @JaredPar:非常感谢您的宝贵帮助!!!非常感谢您的快速回复!
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2023-03-23
  • 2015-05-19
  • 1970-01-01
  • 2010-12-19
  • 2012-05-13
相关资源
最近更新 更多