隐式类型转换:不是 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