У меня есть две библиотеки, от C ++ и C, соответственно:
lib A в C ++:
typedef struct {
char val[4096];
} AString;
lib B в C:
typedef struct STRING_TYPE{
unsigned char *u1_list;
signed int i4_length;
} BString;
Если я не могу коснуться кода lib A & B, то есть не могу добавить оператор приведения в классе AString. Как конфертировать из AString в BString?
РЕДАКТИРОВАТЬ 1 : отдельная функция не определена:
AString as=XXX; // given variable 'as' to convert,
unsigned char p[4096];
size_t const N = std::min(strlen(as.val), 4096);
BString bs = { p, N };
std::copy( static_cast<unsigned char*>(&as.val[0]), static_cast<unsigned char*>(&as.val[N]), bs.u1_list );
// or use memcpy like:
memcpy (bs.u1_list, as.val, N+1);
// then follows the part to use converted variable bs;
func(bs);
но код не имеет модульной структуры.
или еще:
РЕДАКТИРОВАТЬ 2 : по сути, EDIT_1, определить функцию,
void convert (AString& as, BString& bs)
{
size_t const N = std::min(strlen(as.val), 4096);
std::copy( static_cast<unsigned char*>(&as.val[0]), static_cast<unsigned char*>(&as.val[N]), bs.u1_list );
// or use memcpy like:
memcpy (bs.u1_list, as.val, N+1);
bs.i4_length = N;
}
но перед вызовом этой функции пользователь должен определить массив, например
AString as=XXX; // given variable 'as' to convert,
unsigned char p[4096];
BString bs;
bs.u1_list = p;
convert(as, bs);
// then follows the part to use converted variable bs;
func(bs);
Оба довольно неловко.
Нет ли какого-либо отдельного, отдельного способа сделать это?