Если я хочу объявить указатель на буфер, а буфер содержит несколько разных типов (int, char и т.д.), Тогда какой тип я должен сделать указателем на буфер? void *?
Из вашего описания это похоже на то, что вы пытаетесь создать свою собственную сериализацию различных типов в буфер (в реальной жизни это сделать переносимым способом сложно, и в большинстве случаев хорошо определенная библиотека сериализации, такая как протокольные буферы, решает проблему).
В прошлом, когда я использовал пользовательское управление буфером, я видел три способа управления своими буферами
Помните, что если вы распределяете буфер для управления различными типами данных, вы в конечном итоге тщательно читаете байты и отбрасываете их соответствующим типам. Мне нравится 3-й подход как чистый способ читать байты из буфера и поддерживать выравнивание байтов в буфере в процессе.
Под окнами вы можете использовать VARIANT. В Linux вы можете скопировать ссылку
struct tagVARIANT
{
union
{
struct __tagVARIANT
{
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union
{
LONGLONG llVal;
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
_VARIANT_BOOL bool;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
LONGLONG *pllVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
_VARIANT_BOOL *pbool;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
ULONGLONG ullVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
ULONGLONG *pullVal;
INT *pintVal;
UINT *puintVal;
struct __tagBRECORD
{
PVOID pvRecord;
IRecordInfo *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
} ;
Используйте его как переменную, как переменную в языке скриптов.
Если вам нужен один указатель на коллекцию разных типов, вы должны использовать struct:
struct T {
char C;
int I;
...
}
Вы бы использовали его так:
T* ptr = &T();
ptr->C = "d";
ptr->I = 1337;