Я бы сделал это следующим образом (см. Комментарии для получения дополнительной информации):
#include
#include
#include
// This function does not concern me - do not pay attention at memory managemt
void* getObject()
{
uint32_t* oldArr = new uint32_t[2];
oldArr[0] = 1;
oldArr[1] = 2;
// no need for a cast
return oldArr;
};
struct ArrayStruct
{
uint32_t dest[2];
};
void copy_to(ArrayStruct& as, void const* type_erased_source)
{
// std::extent gives us the number of elements in an array
constexpr auto elements = std::extent::value;
// cast the void* to the correct pointer type
auto source = reinterpret_cast(type_erased_source);
// copy the objects to dest
std::copy(source, source + elements, std::begin(as.dest));
}
int main()
{
void* obj = getObject();
ArrayStruct s;
copy_to(s, obj);
std::cout << s.dest[0] << " " << s.dest[1];
}
Если вы посмотрите на какой-нибудь пример ассемблера на Godbolt, вы увидите, что функция copy_to
в конечном итоге скомпилирована в один движение памяти.
copy_to(ArrayStruct&, void const*):
mov rax, QWORD PTR [rsi]
mov QWORD PTR [rdi], rax
В процессе перемещения в многоуровневое приложение Вы могли рассмотреть использование транспортного протокола между слоями, который является независимым языком/технологией (как веб-сервисы, (я думаю tha remobjects поддержки это)).
Это могло сделать переопределение слоя более простым позже (как то, если позже необходимо сделать другую версию клиентского приложения в браузере/Java/Silverlight).
Я могу рекомендовать использовать компоненты Промежуточного программного обеспечения KBM от Components4Developers. Существует определенная кривая обучения, но они очень гибки и держат хорошо при использовании в условиях реального мира.
Комментарий от пользователя (http://www.components4programmers.com/usercomments/commentfromapowerusertoaquestion.htm)
Изменяя Ваше приложение на Мультиуровни с новой платформой (RM, DS, kbmMW, или что когда-либо), внесет много изменений в нашей архитектуре приложения, я рекомендовал пойти с этим в будущем, но можно достигнуть поддержки много базы данных с другими продуктами как
UniDac от DevArt (Лучшие компоненты для базы данных с прямым подключением). AnyDac (от той же Компании, кто предлагает RemObjects. SqlDirect (Имеет поддержку 9 MajorDB и также ODBC). ZeosDB (Открытый исходный код).
с помощью одного из компонентов выше, окажет Вам, поддержка большинству главных баз данных, около него не сделает Вас doig много изменений, и в некоторых случаях Вы просто заменяете старые компоненты базы данных новыми и возможно изменяете некоторые свойства.
Однако изменение на Мультиуровни не только заставит Вас только поддерживать больше баз данных, но оно разделит Вашу бизнес-логику от уровня представления, поэтому у Вас может быть больше уровней представления для Вашего приложения как веб-интерфейс или интеллектуальные устройства.
Но самое важное в архитектуре Мультиуровней, у Вас будет масштабируемая система выращиванием больше, чем, что база данных, которую Вы используете, может обработать соединения, около других преимуществ, как использование других языков для записи клиентских приложений.
Вы также можете исследовать Midware http://www.overbyte.be/frame_index.html