Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c++17中获得“any”中存储的数据大小?_C++_C++17_Sizeof - Fatal编程技术网

如何在c++17中获得“any”中存储的数据大小?

如何在c++17中获得“any”中存储的数据大小?,c++,c++17,sizeof,C++,C++17,Sizeof,假设我有一个这样的函数 int writetofile(wstring name, any sdata){ ... return error; } 此函数不知道将存储哪些数据,但需要知道存储在sdata中的数据的大小。虽然很容易确定sdata中存储的数据类型,但我认为没有简单的方法来了解sdata中数据的大小 我有一个数据结构,它的成员类型为wstring。现在我们无法将该数据结构直接写入文件,因为它包含该wstring。据我在互联网上的研究,写wstring或string的最好方法

假设我有一个这样的函数

int writetofile(wstring name, any sdata){
  ...
   return error;
}
此函数不知道将存储哪些数据,但需要知道存储在sdata中的数据的大小。虽然很容易确定sdata中存储的数据类型,但我认为没有简单的方法来了解sdata中数据的大小

我有一个数据结构,它的成员类型为wstring。现在我们无法将该数据结构直接写入文件,因为它包含该wstring。据我在互联网上的研究,写wstring或string的最好方法是先写字符串的大小,然后再写字符串。然后,当我读字符串时,首先读取大小,然后在此之后读取大小

为此,我做了一个函数

int filemanager::write(any data, fileid uid, DWORD *byteswritten) const
{
    // files is a map<fileid, fileinfo> where fileinfo is a struct which has 
    // members including file's name and handle 
    // fileid is a typedef of int
    if (!files.count(uid)) return -1;
    if (!data.has_value()) return -2;
    if (data.type() == typeid(wstring)) {
        DWORD sz1, sz2;
        wstring str = any_cast<wstring>(data);
        size_t sz3 = str.length()*sizeof(wchar_t);
        if (sz3 == 0) return -2;
        if (FALSE == WriteFile(files[uid].handle, &sz3, sizeof(size_t), &sz1, NULL)){
            return GetLastError();
        }
        if (FALSE == WriteFile(files[uid].handle, str.c_str(), sz3, &sz2, NULL) && sz2 != sz3) {
            return GetLastError();
        }
        if (byteswritten != nullptr) *byteswritten = sz1 + sz2;
    }
    else {
        // now if the type is not a wstring then just write it to a file
        // here i would need the size of the data stored in the data
    }
    return 0;
}
std::any不是您想要做的事情的正确工具。该工具主要用于点a和点B之间的通信,其中两点都知道类型,但通信需要通过一些不需要知道类型的中间代码C进行

如果B需要尝试一系列不同的类型转换来查看提供了哪些值,那么any不是该工作的合适工具。cast的存在是出于类型安全原因:如果提供了错误的any,则具有定义良好的故障路径。也就是说,确保A和B正确通信。它不在那里,所以你可以尝试很多不同的东西

您不能询问存储对象的大小,因为您应该已经知道答案。即使你不知道答案,你也无法有效地使用这个答案

以您的用例为例。任何一个都不是可复制的,所以它不是合法的C++直接将其字节复制到文件中,然后将它们复制回去。即使从概念上来说这样做是可以的,但any可能只存储指向它所包含的对象的指针。所以你只需要写一个指向文件的指针


C++中的序列化不会像你试图做的那样简单。

你能计算SDATA中的字节吗?可能的副本你会如何使用这些信息?你怎么做?请显示一些代码。根据writetofile的名称判断,您的计划是将any对象中包含的类型的内容写入一个文件。对于不可复制的类型,这将非常失败。以std::vector为例;如果将其内容复制到文件中,则可能会复制3个指针。您需要复制向量保存在动态分配内存中的数据。请使用合适的工具。不管怎么说,我不知道在不知道类型的情况下,你将如何进行序列化。在这里,variant可能是正确的工具。