C++是一种静态的编译语言,在编译期间解析模板等等......
但是有可能在运行时创建一个函数,这在源代码中没有描述,并且在编译期间还没有转换为机器语言,因此用户可以向它投入源中没有预料到的数据吗?
我知道这不可能以一种简单的方式发生,但肯定必须是可能的,有很多编程语言没有被编译并且动态创建那些用C或C++实现的东西.
也许如果创建了所有原始类型的工厂,以及将它们组织成更复杂的对象(如用户类型和函数)的合适数据结构,这是可以实现的吗?
欢迎提供有关该主题的任何信息以及指向在线资料的链接.谢谢!
编辑:我知道这是可能的,它更像是我对实现细节感兴趣:)
以下代码不能在 C++20 中编译
#include <iostream>
#include <cstddef>
int main(){
std::byte b {65};
std::cout<<"byte: "<<b<<'\n';// Missing overload
}
Run Code Online (Sandbox Code Playgroud)
std::byteC++17什么时候加入的,为什么没有对应的operator<<重载打印呢?我也许可以理解不打印容器的选择,但为什么不std::byte呢?它试图充当原始类型,我们甚至有 的重载std::string,最近的std::string_view,也许是最相关的 std::complex,并且std::bitset它本身可以被打印。
还有std::hex类似的修饰符,所以默认打印 0-255 应该不是问题。
这只是疏忽吗?怎么样operator>>,std::bitset有它,它根本不是微不足道的。
编辑:发现甚至std::bitset可以打印。
此问题旨在使用std::byte标准输入输出.
是否有计划增加适当的功能重载read(_bytes)和write(_bytes)到的接口basic_istream<CharT>,并basic_ostream<CharT>在将来的标准是什么?有什么理由反对呢?我知道CharT*应该保留-overloads.我该怎么办std::byte?我目前在我的项目功能中定义
std::istream& read(std::istream&, std::byte*, std::streamsize)
std::ostream& write(std::ostream&, const std::byte*, std::streamsize)
Run Code Online (Sandbox Code Playgroud)
这些使用reinterpret_cast<>到char*RESP.const char*但我相信这取决于它的大小char.我错了吗?是char永远1 byte?
我试图制作,std::basic_istream<std::byte>但它缺少std::char_traits<std::byte>等等.有人做过这种事吗?
C++ 有很多类型模糊地描述相同的事物。假设我们正在针对一个字节为 8 位的架构进行编译,则以下所有类型都大致相似:
std::bytestd::uint8_tstd::bitset<8>unsigned char(8 位)char(8 位)如果一个字节是 8 位,那么所有这些类型或多或少可以互换吗?如果没有,什么时候需要使用一个而不是另一个?
我经常在 Stack Overflow 上看到诸如将十六进制字符串转换为字节数组之类的问题,其中有人使用std::uint8_t、char和unsigned char其他类型来表示“字节”。这只是风格偏好的问题吗?
注意:此问答旨在成为社区常见问题解答,鼓励进行编辑。std::byte尽管 C++17 已经引入了这似乎使得选择变得显而易见,但何时使用“字节”的类型以及为什么的问题始终出现。std::bitset提供一个常见问题解答来解决有关、std::uint8_t等作为“字节”的所有误解是很有用的。鼓励编辑。
如何在C ++ 17中将a转换std::string为a std::vector<std::byte>?
编辑:由于要尽可能多地检索数据,所以我正在填充异步缓冲区。所以,我std::vector<std::byte>在缓冲区上使用,我想转换字符串以填充它。
std::string gpsValue;
gpsValue = "time[.........";
std::vector<std::byte> gpsValueArray(gpsValue.size() + 1);
std::copy(gpsValue.begin(), gpsValue.end(), gpsValueArray.begin());
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
error: cannot convert ‘char’ to ‘std::byte’ in assignment
*__result = *__first;
~~~~~~~~~~^~~~~~~~~~
Run Code Online (Sandbox Code Playgroud) 我知道我可以使用reinterpret_cast,但是我不能从 char 转换为像 std::byte 这样的“通用”类型似乎很奇怪。这只是不幸的错误/限制,还是有原因?
示例:
int main(){
std::string s{"abc"};
std::byte* ptr = static_cast<std::byte*>(s.data());
}
Run Code Online (Sandbox Code Playgroud) 我使用STB库将图像加载到内存中.特定函数stbi_load返回指向a的指针unsigned char,该指针是一个数组.
我很想将新的C++ 17 API用于原始数据,std::byte这将使我更具表现力,让我逐个像素地对原始数据进行别名,或者通过将其转换为不同的数据类型来逐个颜色(不同大小的整数).
现在我尝试了这个:
std::unique_ptr<std::byte[], stbi_deleter>(stbi_load(...));
Run Code Online (Sandbox Code Playgroud)
当然,由于缺乏隐式转换,它不起作用.
然后我尝试了:
std::unique_ptr<std::byte[], stbi_deleter>(
static_cast<std::byte*>(stbi_load(...))
);
Run Code Online (Sandbox Code Playgroud)
同样,它仍然没有奏效.我不得不决定使用reinterpret_cast.并让我怀疑这种转换是否合法.我unsigned char*可以std::byte* 根据严格的别名规则合法地转换为?然后我可以将数据转换为另一种数据类型std::uint32_t*并进行变异吗?这会破坏别名规则吗?