Шаблонная функция C++ для построения объекта

Я ищу решение моей текущей проблемы: я использую новое место размещения и для этого использую «макро-магию», чтобы выполнить 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 »)» в функцию?

Я не понимаю, как Fifo("myFifo") может быть типом.

SergeyA 14.06.2018 17:35

Да, я так и думал. Но, может быть, кто-то знает какие-то хитрости.

ambedded 14.06.2018 17:38
new не может вернуть nullptr, если вы не укажете std::nothrow. Вместо этого он вызовет ошибку [std::bad_alloc [(en.cppreference.com/w/cpp/memory/new/bad_al‌ loc). Ваше второе утверждение излишне.
François Andrieux 14.06.2018 17:44

ах забыл об этом, я не могу использовать исключения ... компилятор не может использовать -noexeption ..

ambedded 14.06.2018 17:54

@ambedded Тогда ваше утверждение по-прежнему избыточно. Насколько я знаю, большая часть реализации просто завершится, если вы добавите сборку без метания. В любом случае соответствующий компилятор не должен иметь new, возвращающего nullptr, в любом случае, когда std::nothrow не используется. Это включает в себя использование конкретной платформы, например отключение исключений.

François Andrieux 14.06.2018 17:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
56
1

Ответы 1

С шаблоном у вас может быть следующее с немного другим синтаксисом вызова:

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");

ха! ОК. это выглядит круто и близко к тому, что я использую сейчас. спасибо плохо давай попробуй

ambedded 14.06.2018 17:41

Думаю, есть тип-о. Это каламбур, потому что я думаю, вы имеете в виду T, а не type.

Fantastic Mr Fox 14.06.2018 17:41

@FantasticMrFox: На самом деле больше одной опечатки ;-) Исправлено.

Jarod42 14.06.2018 17:43

Другие вопросы по теме