相关疑难解决方法(0)

是否可以在C++运行期间动态创建函数?

C++是一种静态的编译语言,在编译期间解析模板等等......

但是有可能在运行时创建一个函数,这在源代码中没有描述,并且在编译期间还没有转换为机器语言,因此用户可以向它投入源中没有预料到的数据吗?

我知道这不可能以一种简单的方式发生,但肯定必须是可能的,有很多编程语言没有被编译并且动态创建那些用C或C++实现的东西.

也许如果创建了所有原始类型的工厂,以及将它们组织成更复杂的对象(如用户类型和函数)的合适数据结构,这是可以实现的吗?

欢迎提供有关该主题的任何信息以及指向在线资料的链接.谢谢!

编辑:我知道这是可能的,它更像是我对实现细节感兴趣:)

c++ runtime function dynamic

54
推荐指数
7
解决办法
3万
查看次数

std :: byte的目的是什么?

现在c ++ 17了std::byte,我正在寻找一种方法将读取文件的char代码转换为读取文件的代码byte.一个文件包含字节,而不是一堆整数.

然后我读到了这个问题另一个问题,其中人们认为阅读文件byte是错误的,并且阅读文件char是正确的.

如果byte不是为访问内存而设计的,并且通过类比,文件,那么它的目的是什么?正如其他两个问题所引述:

与char和unsigned char一样,它可以用于访问其他对象占用的原始内存(对象表示),但与这些类型不同,它不是字符类型,也不是算术类型.字节只是一个位集合,只为它定义了按位逻辑运算符.

这听起来像应该用于读取文件的确切类型,而不是字符.

c++ byte c++17

23
推荐指数
1
解决办法
2111
查看次数

为什么打印 `std::byte` 没有过载?

以下代码不能在 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可以打印。

c++ stdout string-view c++20 std-byte

17
推荐指数
2
解决办法
1034
查看次数

如何使用`std :: basic_istream <std :: byte>`之类的东西

此问题旨在使用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++ io std c++17

4
推荐指数
2
解决办法
587
查看次数

字节类型:std::byte vs std::uint8_t vs unsigned char vs char vs std::bitset&lt;8&gt;

C++ 有很多类型模糊地描述相同的事物。假设我们正在针对一个字节为 8 位的架构进行编译,则以下所有类型都大致相似:

  • std::byte
  • std::uint8_t
  • std::bitset<8>
  • unsigned char(8 位)
  • char(8 位)

如果一个字节是 8 位,那么所有这些类型或多或少可以互换吗?如果没有,什么时候需要使用一个而不是另一个?

我经常在 Stack Overflow 上看到诸如将十六进制字符串转换为字节数组之类的问题,其中有人使用std::uint8_tcharunsigned char其他类型来表示“字节”。这只是风格偏好的问题吗?


注意:此问答旨在成为社区常见问题解答,鼓励进行编辑。std::byte尽管 C++17 已经引入了这似乎使得选择变得显而易见,但何时使用“字节”的类型以及为什么的问题始终出现。std::bitset提供一个常见问题解答来解决有关、std::uint8_t等作为“字节”的所有误解是很有用的。鼓励编辑。

c++ byte c++17 std-byte

4
推荐指数
1
解决办法
933
查看次数

如何在C ++ 17中将std :: string转换为std :: vector &lt;std :: byte&gt;?

如何在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)

c++ byte

3
推荐指数
1
解决办法
827
查看次数

为什么我不能 static_cast char* 到 std::byte*?

我知道我可以使用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)

c++ c++20 std-byte

1
推荐指数
1
解决办法
260
查看次数

有没有合法的方法将unsigned char指针转换为std :: byte指针?

我使用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*并进行变异吗?这会破坏别名规则吗?

c++ casting bytebuffer strict-aliasing

-1
推荐指数
1
解决办法
193
查看次数