我可以将指向成员函数的指针转换为char数组,然后使用repret_cast返回吗
Can I convert a pointer to member function to a char array and back using reinterpret_cast?
我有一些代码如下所示:
char member_data[16];
template<typename T>
void set(void (T::*member)(void)) {
memcpy(member_data, (char*) &member, sizeof(member));
}
template<typename T>
void (T::*)(void) get() {
void (T::*member)(void);
memcpy((char*) &member, member_data, sizeof(member));
return member;
}
在完整的上下文中,我可以确定set
总是使用与下面的get
相同的类型
这可以安全地重写为使用reinterpret_cast
吗?
编辑:
这个代码的作用和上面的一样吗?
char member_data[16];
template<typename T>
using member_func = void (T::*)();
template<typename T>
void set(member_func<T> member) {
reinterpret_cast<member_func<T>&>(member_data) = member;
}
template<typename T>
member_func<T> get() {
return reinterpret_cast<member_func<T>&>(member_data));
}
似乎工作
您编辑的部分中的版本无效:您不能将任意char
数组作为任何其他类型访问。通过使用std::aligned_storage<..>
而不是普通的char
阵列,可以以有效的方式实现类似的功能。
如果member_data
被声明为
std::aligned_storage<sizeof(member_func<T>), alignof(member_func<T>)>::type member_data;
或(本质上等同)
alignas(member_func<T>) char member_data[sizeof(member_func<T>)];
那么您的reinterpret_cast<..>
方法实际上应该有效。您可以尝试使用任何固定的member_func<some_class>
,而不是依赖于模板参数的sizeof
和alignof
表达式。对于指向不同类的成员函数的指针,实现不太可能具有不同的大小或对齐要求。如果您想要真正安全,请使用静态断言进行检查。
这可以安全地重写为使用repret_cast吗?
除了编辑中描述的内容外,仅当SomeType
也是指向成员类型的指针时,才可以直接强制转换成员函数指针,如reinterpret_cast<SomeType>(member)
。因此,可以选择一个指向成员函数类型的指针作为"通用成员函数指针存储",如果您所要做的只是将该值转换回原始成员指针类型。
不能将指向成员的指针转换为指向对象的指针(反之亦然)。
在这两种情况下,您的代码都是不安全的,因为如果是sizeof (void (T::*)()) > 16
,它将溢出member_data
缓冲区。
顺便说一句:第一个代码示例已经使用了reinterpret_cast
:从void (T::**)()
转换到(char*)
的旧样式已经相当于reinterpret_cast
;-)
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在std::thread中,joinable()然后join()线程安全吗
- C++:如何读取分离变量,然后读取向量
- 为什么我的递归函数按降序打印,然后按升序打印?
- 等待整个 omp 块完成,然后再调用第二个函数
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使变量从 x 到 y,然后从 y 返回到 x 并始终重复该过程
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 如何正确地推回然后遍历堆中对象的向量?
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- 如何在字符串中找到字符,然后在C++中提取其余的字符串
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 将加密消息从 php 发送到 C++ 应用程序,然后使用 CryptoPP 进行解密
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?