Устранение дублирования между похожими функциями в C и C ++ в шаблоне EmPy

Эти @ вещи Empy

C ++

  const char *
publish__@(spec.base_type.type)(void * untyped_data_writer, const void * untyped_message)
{
DataWriter * topic_writer = static_cast<DataWriter *>(untyped_data_writer);
const __ros_msg_type & ros_message = *(const __ros_msg_type *)untyped_message;
__dds_msg_type dds_message;
conversion_cpp(ros_message, dds_message);

@(__dds_msg_type_prefix)DataWriter * data_writer =
@(__dds_msg_type_prefix)DataWriter::_narrow(topic_writer);
DDS::ReturnCode_t status = data_writer->write(dds_message, DDS::HANDLE_NIL);

// some common switch statements in C and C++

}
}

С

static const char *
publish(void * data_writer, const void * cool_message)
{
if (!data_writer) {return "data writer handle is null";}
if (!cool_message) {return "ros message handle is null";}

DDS::DataWriter * topic_writer = static_cast<DDS::DataWriter *>(data_writer);
__dds_msg_type dds_message;
const char * err_msg = conversion_c(cool_message, &dds_message);
if (err_msg != 0) {return err_msg;}

@(__dds_msg_type_prefix)DataWriter * data_writer =
@(__dds_msg_type_prefix)DataWriter::_narrow(topic_writer);
DDS::ReturnCode_t status = data_writer->write(dds_message, DDS::HANDLE_NIL);
@[for field in spec.fields]@
@[if field.type.type == 'string']@
@[if field.type.is_array]@
{
@[if field.type.array_size]@
size_t size = @(field.type.array_size);
@[else]@
size_t size = dds_message.@(field.name)_.length();
@[end if]@
for (DDS::ULong i = 0; i < size; ++i) {
// This causes the DDS::String_mgr to release the given c string without freeing it.
dds_message.@(field.name)_[i]._retn();
}
}
@[else]@
// This causes the DDS::String_mgr to release the given c string without freeing it.
dds_message.@(field.name)_._retn();
@[end if]@
@[end if]@
@[end for]@

// some common switch statements in C and C++
}
}

Этот вопрос немного специфичен для проекта с открытым исходным кодом, в который я пытаюсь внести свой вклад, поэтому я укажу точные функции, которые я предполагаю.
Это оригинал С метод
и это Метод C ++

Нужно ли использовать указатели на функции?
Здесь также происходит то, что пакет C зависит от пакета C ++.

(Может быть, это не очень хороший вопрос или расплывчатый вопрос, но я не уверен, что делать, поскольку я новичок в этой кодовой базе)

1

Решение

Задача ещё не решена.

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector