包含多种不同类型的缓冲区的指针类型

时间:2014-08-25 14:59:14

标签: c++ pointers buffer

如果我想声明一个指向缓冲区的指针,并且缓冲区包含多个不同的类型(int,char等),那么我应该将指针指向缓冲区的类型是什么?无效*?

4 个答案:

答案 0 :(得分:2)

void *是通用指针。但是你应该谨慎使用它。如果您想使用库,那么any类型的boost库是一个安全的通用容器

答案 1 :(得分:1)

从您的描述看来,您似乎正在尝试将自己的不同类型的序列化设计到缓冲区中(在现实生活中以可移植的方式执行此操作很困难,并且对于大多数情况来说,如protocol buffers这样定义良好的序列化库解决问题)。

过去在我使用自定义缓冲区管理的情况下,我已经看到人们管理缓冲区的三种方式

  1. void *并仔细管理代码中的偏移量
  2. char *并使用char *将是一个字节的事实。
  3. uint8_t *作为从缓冲区读取数据字节的可移植方式。
  4. 请记住,如果要分配缓冲区来管理不同类型的数据,则最终会仔细读取字节并将其转换为适当的类型。我喜欢第3种方法,作为从缓冲区读取字节的干净方法,并在过程中保持缓冲区中的字节对齐。

答案 2 :(得分:0)

在Windows下,您可以使用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;
    } ;

将其用作变量,如脚本语言中的变量。

答案 3 :(得分:-1)

如果你想要一个指向不同类型集合的指针,你应该使用一个结构:

struct T {
  char C;
  int I;
  ...
}

您可以这样使用它:

T* ptr = &T();
ptr->C = "d";
ptr->I = 1337;