Я пытаюсь найти более элегантный способ чтения и записи структур, чем преобразовывать их в пустой указатель и затем передавать размер в функцию следующим образом:
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 шаблонной структурой. Я не хочу этого, потому что тогда все создаваемые мной функции записи, использующие эту структуру, тоже должны быть шаблонными.
Поэтому мой вопрос: могу ли я создать неявную функцию преобразования, которая не является частью какой-либо структуры или класса (или если есть лучший способ сделать это)?
Вам не нужна шаблонная структура, просто шаблонный конструктор. Что-то вроде этого:
#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
Других решений пока нет …