template<typename ActorType>
ActorType* CreateActor()
{
EngineActor* NewActor = new ActorType();
NewActor->SetParent(this);
NewActor->Start();
return dynamic_cast<ActorType*>(NewActor);
}
Это функция, которая создает и возвращает класс, полученный в качестве шаблона.
Я хочу реализовать это без использования шаблона. Что я должен делать?
void* CreateActor(int _ActorSize,void* _Dummy)
{
void* Result = malloc(_ActorSize);
memcpy_s(Result, _ActorSize, _Dummy, _ActorSize);
EngineActor* pCast = (EngineActor*)Result;
pCast->SetParent(this);
pCast->Start();
delete _Dummy;
return result;
}
Я попробовал метод, в котором вызывающий объект создает манекен, получает размер класса и манекен в качестве параметров и записывает его в память. Но проблема в том, что вызывающему абоненту приходится использовать оператор new для создания фиктивного объекта.
Извините, я отредактировал это
@nyori Я думаю, дело в том, «почему ваш вопрос помечен буквой C?»
Это пахнет проблемой XY. Почему вы пытаетесь заменить версию template? Если использовать C, то this и delete также являются проблемами вашей текущей попытки.
Я хочу удалить шаблон и изменить его на стиль C.
Почему? То, с чего вы начинаете, - это довольно идиоматический C++, который делает что-то, что действительно не имеет аналога в C.
Тогда вам нужно проделать гораздо больше работы, чем просто удалить шаблон. Языковые переводы зачастую очень сложны. Часто настолько сложно, что вам лучше вернуться к требованиям и проектным документам и переписать одну страницу на другом языке.
Я хочу разделить функцию CreateActor на dll, но хочу удалить шаблон из интерфейса.
CreateActor не является функцией. CreateActor<SomeActorType> — это функция.
Несвязано: dynamic_cast<ActorType*> экземпляра ActorType* бессмысленно. Это уже такого типа, если бы только было объявлено как ActorType* NewActor = new ActorType();. Кроме того, функция не следует принципу единой ответственности, поскольку она создает актера и запускает его. И, наконец, он подвержен утечкам; вместо этого лучше вернуть unique_ptr<ActorType>.





Невозможно заменить CreateActor одной функцией.
Это функция, которая создает и возвращает класс, полученный в качестве шаблона.
Нет, это не так. Шаблон функции — это не функция, это рецепт семейства функций.
Я хочу реализовать это без использования шаблона. Что я должен делать?
Скопируйте и вставьте определения для каждого типа, с которым вы его используете.
Скопируйте и вставьте определения для каждого типа, с которым вы его используете. Возможно через макрос :)
Это довольно забавно, @Виктор. Когда я прочитал заголовок, первое, что пришло на ум, было #define template replacement. УБ, конечно, но все самое интересное — это УБ.
Так чем же занимались разработчики в те времена, когда шаблонов не было? Они не определили все типы. Я спрашиваю, какой метод они использовали.
@nyori посмотри X Macros in C
@nyori да, они это сделали. Не существует эквивалента CreateActor в C. Ваша dll не может предоставить функцию, создающую экземпляр типа, структура которого ей неизвестна, но шаблон может.
Я не большой поклонник макросов. Если у меня был сложный или длинный список неизбежного дублирования, я писал другую программу для анализа файла описания (который иногда представлял собой исходный код C, в котором использовался сгенерированный код) и генерации необходимого кода. генератор будет встроен в make-файл, чтобы гарантировать, что он всегда будет перегенерирован, если все, что он использовал, было обновлено. Раньше было намного проще отлаживать сгенерированный исходный файл, чем пытаться вникнуть в макросы. Отладчики теперь стали умнее, поэтому ваш опыт будет меняться.
@Виктор: МАКРО не нужен, extern "C" /*DLL_EXPORT*/ ActorType1* CreateActor1() { return CreateActor<ActorType1>(); }.
Result->SetParent(this)сам по себе не является допустимым C и не является допустимым в контексте C++.delete _Dummyневероятно мило