Простой способ преобразовать в РАЗЛИЧНЫЕ типы в C++

Есть ли любые простые в использовании, высокоуровневые классы или библиотеки, которые позволяют Вам взаимодействовать с VARIANTs в Visual C++?

Строго говоря, я хотел бы преобразовать между типами POD (например. double, long), строки (например. CString), и контейнеры (например. std::vector) и VARIANTs. Например:

long val = 42;
VARIANT var;
if (ToVariant(val, var)) ...     // tries to convert long -> VARIANT
comObjPtr->someFunc(var);

std::vector vec;
VARIANT var = comObjPtr->otherFunc();
if (FromVariant(var, vec)) ...   // tries VARIANT -> std::vector

Я (наивно?) предположил, что люди, работающие с COM, делают это все время, таким образом, скорее всего, была бы единственная удобная библиотека, которая обрабатывает все виды преобразований. Но все, что я смог найти, является разноцветным выбором классов обертки, что каждый преобразовывает несколько типов:

Есть ли любой простой путь - за исключением переключения на Visual Basic - для предотвращения этого кошмара неловкого управления памятью и поразрядно VT_ARRAY | VT_I4 код?

Связанные вопросы:

7
задан Community 23 May 2017 в 12:17
поделиться

1 ответ

Что ж, большая часть тяжелой работы уже сделана за вас с помощью различных классов-оболочек. Я предпочитаю _variant_t и _bstr_t, поскольку они больше подходят для преобразования в / из типов и строк POD. Для простых массивов все, что вам действительно нужно, это функция преобразования шаблонов. Что-то вроде следующего:

// parameter validation and error checking omitted for clarity
template<typename T>
void FromVariant(VARIANT Var, std::vector<T>& Vec)
{
    CComSafeArray<T> SafeArray;
    SafeArray.Attach(Var.parray);
    ULONG Count = SafeArray.GetCount();
    Vec.resize(Count);
    for(ULONG Index = 0; Index < Count; Index++)
    {
        Vec[Index] = SafeArray[Index];
    }
}
....
std::vector<double> Vec;
VARIANT Var = ...;
FromVariant(Var, Vec);
...

Конечно, все становится непросто (в отношении управления памятью / временем жизни), если массив содержит типы, не относящиеся к POD, но это все еще выполнимо.

5
ответ дан 7 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: