Переходя от парадигмы C к современной C ++, я пытаюсь выяснить, какой может быть лучшая замена C ++ для способа представления вариантов COM или устройства более старого стиля: PROPVARIANT , и DEVPROPERTY .
В смысле C эти варианты являются просто структурой с: ключом (GUID, пара PID), типом данных (который является просто UIN32) и буфер.
typedef struct _DEVPROPERTY {
DEVPROPCOMPKEY CompKey;
DEVPROPTYPE Type;
ULONG BufferSize;
PVOID Buffer;
} DEVPROPERTY, *PDEVPROPERTY;
С их помощью PnP и старые COM-компоненты типа Shell могут передавать данные свойств в общем виде.
Я знаю, что могу просто повторно использовать эти C структуры в c ++, но Как можно сделать это с современным C ++?
Я знаю, что есть std :: variable , который, кажется, является хорошей заменой для объединения, но я не думаю, что это помогает с обнаружением типов.
Существует также std :: any , который выглядит как вариант std ::, но без предопределения типов.
В любом случае, я не уверен, как загрузить данные и заново открыть тип данных непосредственно с ними. Я думаю, я мог бы просто иметь структуру с типом, определенным как enum, и использовать std: вариант вместо объединения.
Например, мне все еще нужно иметь возможность сделать что-то вроде этого:
void DoSomething(DEVPROPERTY* prop)
{
// assume we would be doing safe things with these pointers instead of directly derefing them and casting them :)
switch (prop->Type) {
case DEVPROP_TYPE_INT32:
LONG val = *(LONG*)prop->Buffer;
break;
}
}