C ++ функция для создания и уничтожения временных данных с заданными параметрами типа и конструктора - PullRequest
0 голосов
/ 07 декабря 2011

В моем коде я нахожу много следующего:

{
    SomeClass<VisitorType> obj(visitor, param1, param2, 3, 4);
}
{
    OtherClass<VisitorType> obj(visitor, 5, "six");
}

Скобки необходимы для обеспечения ограничения срока службы объекта, работа выполняется в конструкторе и деструкторе (стиль RAII). Для этого есть веская причина, и другие пользователи этих шаблонов классов делают больше, чем просто создают и разрушают.

Есть ли удобная идиома, сводящая это к чему-то вроде вызова функции, где возможно сохранение строгой типизации?

, например

f<SomeClass>(visitor, param1, param2, 3, 4);
f<OtherClass>(visitor, 5, "six");

где f<>() что-то вроде:

template <template <class> class C, class V>
void f(V &v, ...)
{
    C<V> c(v, ...); // magic needed here
}

Я пытался использовать функции с переменными числами, но попал в кучу ошибок компиляции. Я бы предпочел не использовать макросы, если это возможно. Спасибо!

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

Как насчет

SomeClass<VisitorType>(visitor, param1, param2, 3, 4);

Кажется, это работает для меня.

Однако я бы не оставил такую ​​строку кода в какой-либо функции, не предоставив комментарий, объясняющий, что исключение объекта было преднамеренным.Функция, с другой стороны, была бы удобным местом для размещения такой документации:

// call C<V>'s ctor, leaving the caller to decide when to call dtor
template<template <class> class C, typename V, typename... Args>
C<V> fire_and_forget(V& visitor, Args&&... args) {
  return C<V>(visitor, std::forward<Args>(args)...);
}

Затем используйте ее так:

fire_and_forget<SomeClass>(visitor, param1, param2, 3, 4);
0 голосов
/ 07 декабря 2011

Это должно работать (C ++ 11):

template<typename class_t, typename... args_t>
void cdtor(args_t... args) {
  class_t(args...) obj;
  // do stuff with obj
} 

cdtor<foo>(1, 2, 3);

Хотя макросы будут работать так же хорошо:

#define cdtor(x) do { auto obj = x; /* do stuff with obj */ } while(false)

cdtor(foo(1, 2, 3));
Макрос

C ++ 03 с расширением typeof:

#define cdtor(x) do { typeof(x) obj = x; /* do stuff with obj */ } while(false)
...