C++ Void非指针

Tom*_*mas 3 c++ types casting void

我在想,为什么不能有一个不是指针的void数据类型?

当然,你可以通过拥有可以超越整个确定尺寸的东西

void4
void8
void32
Run Code Online (Sandbox Code Playgroud)

然后只允许将一个void数据类型"强制转换"为另一个类,如果它的大小等于或小于类的大小.

有什么东西我不知道,或者C++委员会只是认为它是不好的做法?

编辑:

我没有很好地解释自己,所以我将举例说明它的用法:

 main()
{
    /* 

     Lets make a list of unknown elements

     std::string is 8 bytes, and float is 4
     bytes, so we'll reserve 8 byte sequences

     */

    vector<void8> elements;

    elements.push_back((void8) string("First string element"));

    elements.push_back((void8) float(5.76) );

    elements.push_back((void8) string("Third string element"));

    // Ect.

    cout << (string) elements[0];
    cout << (float) elements[1];
    cout << (string) elements[2];
    cout << (float) elements[2]; // Garbage


    void1 data;

    data = (void1) bool(1);
    data = (void1) unsigned int(80094); // Error, not enough size
}
Run Code Online (Sandbox Code Playgroud)

它名为void,因为你不知道它当前存储的类型,类似于void指针.

Pup*_*ppy 8

它被称为boost :: variant或boost :: any.它是允许的最大数据类型+ sizeof(指针)的大小,完全是类型安全的.

  • @Tomas Cokis:因为你会调用大量未定义的行为,在类周围进行memcpying,这需要非平凡的构造,破坏等.另外,你必须创建数亿个对象才能注意到sizeof(指针) ).最后,由于sizeof(std :: string)未定义,因此完全不可移植.数据不仅仅是位和字节,还需要安全地使用大量编译时元数据.您可以在运行时(boost :: variant)存储该数据,也可以在编译时将其设置为一种特定类型,因此您无需存储它. (4认同)