Не существует «однострочного решения без усложнения вашего кода».
Худшее решение - сохранить этот параметр в глобальной переменной и извлечь его из обработчика atexit
Поскольку вы используете C ++, деструктор статической переменной также может служить обработчиком atexit
. Затем вы можете передать параметр в конструктор этой статической переменной для параметризации, например,
struct AtExitAnimationCloser
{
const char* _which_param;
AtExitAnimationCloser(const char* which_param) : _which_param(which_param) {}
~AtExitAnimationCloser() { FileWriter::closeAnimation(_which_param); }
};
void f()
{
printf("entering f\n");
static AtExitAnimationCloser s0 ("0"); // registers closeAnimation("0") at exit
static AtExitAnimationCloser s1 ("1"); // registers closeAnimation("0") at exit
printf("leaving f\n");
}
Демонстрация: http://www.ideone.com/bfYnY
Обратите внимание, что статические переменные связаны с их именем, поэтому вы не можете сказать
for (it = vecs.begin(); it != vecs.end(); ++ it)
{
static AtExitAnimationCloser s (*it);
}
для вызова atexit для всего содержимого. Но вы могли бы заставить статическую переменную принимать весь диапазон
static AnotherAtExitAnimationCloser s (vecs.begin(), vecs.end())
Наконец, с идиоматическим C ++ я не думаю, что вам нужно использовать эти приемы ... Вы могли бы хранить вектор типов T, который при уничтожении ~ T вызывает fileWriter::closeAnimation
.