Неявное преобразование типов: не является членом класса или структуры

Я пытаюсь найти более элегантный способ чтения и записи структур, чем преобразовывать их в пустой указатель и затем передавать размер в функцию следующим образом:

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 шаблонной структурой. Я не хочу этого, потому что тогда все создаваемые мной функции записи, использующие эту структуру, тоже должны быть шаблонными.

Поэтому мой вопрос: могу ли я создать неявную функцию преобразования, которая не является частью какой-либо структуры или класса (или если есть лучший способ сделать это)?

3

Решение

Вам не нужна шаблонная структура, просто шаблонный конструктор. Что-то вроде этого:

#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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]