gpt4 book ai didi

c++ - 对于写入二进制文件的接口(interface),应将 void*/std::size_t 函数参数对更改为什么?

转载 作者:太空狗 更新时间:2023-10-29 22:54:30 24 4
gpt4 key购买 nike

C++ 核心指南多次指出,使用 void* 作为参数充其量是令人困惑的,最坏的情况是容易出错。我最喜欢的提及是在最后:

C++ Core Guidelines: To-do: Unclassified proto-rules

Anyone writing a public interface which takes or returns void* should have their toes set on fire. That one has been a personal favorite of mine for a number of years. :)

也就是说:

为了符合这个建议,这个函数签名应该改成什么?目前它适用于任何可以重新解释为 const char* 的东西:

bool writeBufferToFile(void* buffer, std::size_t size, const std::string& filePath) const
{
namespace FS = std::filesystem;
FS::path p(filePath);
p.make_preferred();
bool not_valid_path = FS::is_directory(p);
bool invalid = not_valid_path;
if(invalid) { return false; }

std::ofstream ofs;
ofs.open(p.string(), std::ios_base::binary);
if(ofs)
{
ofs.write(reinterpret_cast<const char*>(buffer), size);
return true;
}
return false;
}

最佳答案

你想要的不是两个参数,一个指针和一个大小,而是一个代表二进制数据 block 的参数。在理想情况下,您可能会使用类似 std::vector<std::uint8_t> const& 的内容,但这样做的问题是,如果调用者碰巧以其他方式存储数据,它会强制调用者进行分配/复制/释放。

因此,您真正需要的是一个表示二进制数据 block 但不拥有该数据并且可以非常便宜地构造、复制和销毁的类,而不管底层数据是如何存储的。这避免了需要两个参数来表达一个概念。

封装它的类通常称为 Slice .所以我建议:

class Slice
{
private:
std::uint8_t const* data_;
std::size_t size_;
...
};

bool writeBufferToFile (const Slice& data, const std::string& filePath) const

你的 Slice可以很容易地从 std::vector <std::uint8_t> 构建类或者几乎任何其他保存字节范围的合理方式。

关于c++ - 对于写入二进制文件的接口(interface),应将 void*/std::size_t 函数参数对更改为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55555782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com