Аргумент типа C ++ несовместим с параметром типа void (__cdecl *) (void) при вызове std :: atexit () - PullRequest
0 голосов
/ 29 мая 2020

При использовании некоторых библиотек C ++ я часто встречал функции с параметрами, требующими указателей на функции. Это означает, что методы не будут приняты.

Например, std atexit(void (__cdecl*)(void));

В этом случае очень неудобно вызывать такую ​​функцию из класса, когда вы хотите передать функциональность из метода.

Я знаю об этих двух обходных путях, но они имеют недостатки / кажутся невозможными:

  • Объявление метода как stati c: означает, что этот метод не может вызывать любые другие нестатические c методы из того же класса.
  • Передача фактической функции: Абсолютный беспорядок, и может потребоваться всевозможные черные маги c, чтобы получить правильную функциональность для выполнения в рамках метода. есть ли для этих ситуаций вообще? Или, по крайней мере, для вызова примера atexit () из класса, в котором метод был бы идеальным в качестве функции выхода.

1 Ответ

0 голосов
/ 29 мая 2020

atexit функций вызываются при выходе из программы в обратном порядке. На этом этапе также вызываются локальные деструкторы объекта stati c. Итак, в этом примере:

void f()
{
  static X x;
  atexit(f1);
  static Y y;
}

При первом вызове x и y деструкторы будут зарегистрированы для вызова при выходе из программы, а f1() будет вызываться между y.Y::~Y() и x.X::~X() .

Итак, если вы создаете коллекцию из std::function объектов, которые будут вызываться при уничтожении коллекции, это может быть жизнеспособным обходным путем.

Это все еще может не работать для нескольких функций, поскольку все будут вызываться в одном l oop, а не в порядке LIFO относительно другого вызова stati c destructor / atexit.


Другим вариантом может быть просмотр at_thread_exit. Он имеет другое семанти c, но может также соответствовать вашим потребностям.


Thunk, упомянутый @Remy Lebeau, может быть лучшим решением. Но реализовать это может быть нетривиально, поэтому я предлагаю рассмотреть и другие обходные пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...