Шаблонная функция C ++ с динамическими переменными c - PullRequest
0 голосов
/ 14 марта 2020

Я ищу решение -std = gnu ++ 17 (или 20, если оно уже доступно) для работы с объектами и mallo c. там я хочу иметь функцию шаблона для распределения памяти c с помощью mallo c и создания объекта. сам объект может быть чем угодно, поэтому ему может понадобиться 10 аргументов в конструкторе или их нет. как я могу поддержать функцию шаблона? идея должна быть аналогична списку аргументов переменных printfs, но здесь не аргументы для печати, а переменные для вызова конструктора.

В новых стандартах c ++ много чего происходит, но это также довольно запутанно, если вы к этому не привыкли. кто-то действительно в курсе этих функций C ++ и может помочь?

В ЭТОМ ОБСУЖДЕНИИ НЕ СЛЕДУЕТ ВКЛЮЧАТЬ «КАК РАСПРЕДЕЛИТЬ ОБЪЕКТЫ ПАМЯТИ И СТРОИТЕЛЬСТВА». КОДИРОВАНИЕ ШАБЛОНА ИНТЕРЕСНО

template<typename T, typename... args>
T * malloc_and_construct()
{
    T* pobj = (T*)malloc(sizeof(T));
    if(pobj) new (pobj) T(args...);
    return pobj;
}
template<typename T>
void destruct_and_free(T* pobj)
{
    if(pobj) {
        pobj->~T();
        free(pobj);
    }
}

Ответы [ 2 ]

1 голос
/ 14 марта 2020
// Example program
#include <iostream>
#include <string>
#include <cstdlib>

template<typename T, typename... Args>
T * malloc_and_construct(Args &&... args)
{
    T* pobj = (T*)malloc(sizeof(T));
    if(pobj) new (pobj) T(std::forward<Args>(args)...);
    return pobj;
}
template<typename T>
void destruct_and_free(T* pobj)
{
    if(pobj) {
        pobj->~T();
        free(pobj);
    }
}

struct A
{
    A(int a, int b) : a(a), b(b) { printf("A %d %d\n", a,b); }
    ~A() { printf("~A\n");  }
    private:
    int a;
    int b;
};

struct B
{
    B() { printf("B\n"); }
    ~B() { printf("~B\n"); }
};


int main()
{
    A * a = malloc_and_construct<A>(2, 3);
    B * b = malloc_and_construct<B>();

    destruct_and_free(a);
    destruct_and_free(b);

    return 0;
}

результат:

A 2 3 B ~ A ~ B

1 голос
/ 14 марта 2020

Это то, что вы ищете?

template<typename TClass, typename ... TArgs>
TClass* malloc_and_construct(TArgs&& ... args)
{
    auto* ptr = malloc(sizeof(TClass));
    if (ptr == nullptr)
        return nullptr;
    return new (ptr) TClass { std::forward<TArgs>(args)... };
}
...