Я ищу решение моей текущей проблемы: я использую новое место размещения и для этого использую «макро-магию», чтобы выполнить 3 шага за один:
// macro magic
#define sys_construct(ptr,mem,type) \
assert(!ptr); \
ptr = new(mem) type; \
assert(ptr)
// my member
osif::I_List uartFifo;
uint8_t mem_uartFifo[sizeof(Fifo)];
// object construction
sys_construct(uartFifo, mem_uartFifo, Fifo("myFifo"));
Это прекрасно работает, но основано на макросах, которые мне не особо нравятся.
Я ищу решение (пока не нашел), которое выглядело бы следующим образом:
template<typename T_PTR, typename T_MEM, typename T_TYPE>
inline static void sys_construct(T_PTR ptr, T_MEM mem, T_TYPE type)
{
assert(!ptr);
ptr = new(mem) type;
assert(ptr);
}
Проблема в основном связана с моим типом: как я могу ввести «Fifo (« myFifo »)» в функцию?
Да, я так и думал. Но, может быть, кто-то знает какие-то хитрости.
new не может вернуть nullptr, если вы не укажете std::nothrow. Вместо этого он вызовет ошибку [std::bad_alloc [(en.cppreference.com/w/cpp/memory/new/bad_al loc). Ваше второе утверждение излишне.
ах забыл об этом, я не могу использовать исключения ... компилятор не может использовать -noexeption ..
@ambedded Тогда ваше утверждение по-прежнему избыточно. Насколько я знаю, большая часть реализации просто завершится, если вы добавите сборку без метания. В любом случае соответствующий компилятор не должен иметь new, возвращающего nullptr, в любом случае, когда std::nothrow не используется. Это включает в себя использование конкретной платформы, например отключение исключений.





С шаблоном у вас может быть следующее с немного другим синтаксисом вызова:
template <typename T, typename Ptr, typename ...Ts >
void sys_construct(T& ptr, uint8_t* mem, Ts&&... args)
{
ptr = new (mem) T(std::forward<Ts>(args)...);
}
С использованием
sys_construct<Fifo>(*uartFifo, mem_uartFifo, "myFifo");
ха! ОК. это выглядит круто и близко к тому, что я использую сейчас. спасибо плохо давай попробуй
Думаю, есть тип-о. Это каламбур, потому что я думаю, вы имеете в виду T, а не type.
@FantasticMrFox: На самом деле больше одной опечатки ;-) Исправлено.
Я не понимаю, как
Fifo("myFifo")может быть типом.