преобразование между std :: vector и _variant_t - PullRequest
1 голос
/ 31 августа 2011

Мне нужно конвертировать между std::vector и _variant_t, чтобы избежать зацикливания при записи / отправке данных в какой-либо файл (база данных, Excel и т. Д.)

Не могли бы вы дать мне знать, как продолжитьчто?

Я пытался получить std::vector<_variant_t> и каким-то образом поместить в другую переменную _variant_t, но прямое преобразование не поддерживается, и даже если это сделано, нет ни метода, ни какой-либо оболочки, чтобы получить этовектор в переменную _variant_t.

Я бы предпочел не иметь дело с любыми циклами.

1 Ответ

6 голосов
/ 31 августа 2011

A 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);
...