隐式类型转换:不是 Class 或结构的成员
Implicit Type Conversion: Not Member of Class or Struct
我正在尝试找到一种更优雅的方式来读写结构,而不是将它们转换为 void 指针,然后像这样将大小传递给函数:
void write(void* value, size_t length); //Write is some random write function
Type var;
write((void*)var,sizeof(Type));
所以我试图创建一个方法来将任何类型隐式转换为结构,如下所示:
struct VoidPtrReplacement{
uint8_t* bytes;
size_t size;
};
然后我可以(假设我能找到一种方法将任何其他类型隐式转换为这种类型)创建像这样的良好的读写函数:
void write(VoidPtrReplacement* value);
Type var;
write(var);
不幸的是,我能找到的从任何其他类型转换为这种类型的唯一方法是使 VoidPtrReplacement 成为模板化结构。我不想这样做,因为我创建的任何使用此结构的写入函数也必须被模板化。
所以我的问题是:我可以创建一个不属于任何结构或 class 的隐式转换函数吗(或者是否有更好的方法来做到这一点)?
您不需要模板化结构,只需要模板化构造函数。像这样:
#include <iostream>
#include <vector>
struct VoidPtrReplacement{
const unsigned char *bytes;
size_t size;
template<typename T>
VoidPtrReplacement(T &&t)
: bytes(reinterpret_cast<unsigned char *>(&t)),
size(sizeof(T))
{
}
};
void write(const VoidPtrReplacement &p)
{
std::cout << "Write: " << (void *)p.bytes << ", " << p.size << " bytes"
<< std::endl;
}
class Foo {
int i=4;
};
class Bar {
char c=0;
int b=3;
};
int main()
{
Foo foo;
Bar bar;
std::cout << "Address of foo: " << &foo << std::endl;
std::cout << "Address of bar: " << &bar << std::endl;
write(foo);
write(bar);
}
示例输出:
Address of foo: 0x7ffd5eba4c80
Address of bar: 0x7ffd5eba4c60
Write: 0x7ffd5eba4c80, 4 bytes
Write: 0x7ffd5eba4c60, 8 bytes
我正在尝试找到一种更优雅的方式来读写结构,而不是将它们转换为 void 指针,然后像这样将大小传递给函数:
void write(void* value, size_t length); //Write is some random write function
Type var;
write((void*)var,sizeof(Type));
所以我试图创建一个方法来将任何类型隐式转换为结构,如下所示:
struct VoidPtrReplacement{
uint8_t* bytes;
size_t size;
};
然后我可以(假设我能找到一种方法将任何其他类型隐式转换为这种类型)创建像这样的良好的读写函数:
void write(VoidPtrReplacement* value);
Type var;
write(var);
不幸的是,我能找到的从任何其他类型转换为这种类型的唯一方法是使 VoidPtrReplacement 成为模板化结构。我不想这样做,因为我创建的任何使用此结构的写入函数也必须被模板化。
所以我的问题是:我可以创建一个不属于任何结构或 class 的隐式转换函数吗(或者是否有更好的方法来做到这一点)?
您不需要模板化结构,只需要模板化构造函数。像这样:
#include <iostream>
#include <vector>
struct VoidPtrReplacement{
const unsigned char *bytes;
size_t size;
template<typename T>
VoidPtrReplacement(T &&t)
: bytes(reinterpret_cast<unsigned char *>(&t)),
size(sizeof(T))
{
}
};
void write(const VoidPtrReplacement &p)
{
std::cout << "Write: " << (void *)p.bytes << ", " << p.size << " bytes"
<< std::endl;
}
class Foo {
int i=4;
};
class Bar {
char c=0;
int b=3;
};
int main()
{
Foo foo;
Bar bar;
std::cout << "Address of foo: " << &foo << std::endl;
std::cout << "Address of bar: " << &bar << std::endl;
write(foo);
write(bar);
}
示例输出:
Address of foo: 0x7ffd5eba4c80
Address of bar: 0x7ffd5eba4c60
Write: 0x7ffd5eba4c80, 4 bytes
Write: 0x7ffd5eba4c60, 8 bytes