Чтобы выполнить некоторое пользовательское отслеживание памяти (предотвращение утечки, обнаружение повреждения), мне приходится использовать новое размещение для создания объектов С++, что отлично работает, но я изо всех сил пытаюсь понять, как я могу передать аргументы конструктору, поскольку он вызывается из макроса (поэтому файл + строка могут быть предоставлены автоматически).
Функция:
template <typename T>
T*
cpp_new(
const char *file,
size_t line
)
{
T *n = (T*)tracked_allocate(&memory_context, sizeof(T), file, line);
if ( n )
{
construct(n);
}
else
{
throw std::bad_alloc();
}
return n;
}
Вызывается через макрос:
#define new_object(type) cpp_new<type>(__FILE__, __LINE__)
Размещены новые:
template <typename T>
void
construct(
T *obj
)
{
obj = new (obj) T;
}
Макросы va_list охватывают расширение для переменного количества аргументов, только я не хочу предоставлять количество аргументов, которое имеет конструктор, удаляя va_arg(), и не могу использовать va_start(), так как он ожидает формат.
Это пролетело мимо меня: http://www.drdobbs.com/cpp/calling-constructors-with-placement-new/232901023?pgno=2
Можно ли как-нибудь использовать __VA_ARGS__
из new_object и передать их в функцию построения? У каждого объекта есть только один конструктор, но есть много разных типов объектов, принимающих разные параметры, поэтому я хочу убрать как можно больше ручного обслуживания.
Или есть лучший способ сделать то, что я пытаюсь сделать!