自动回调以关闭文件记录器中包含的 fstream class

Automatic callback to close fstream contained in file logger class

为了在我的 C++ 应用程序的不同部分记录不同的值,我希望能够实例化一个 class,它抽象了在文件中记录不同值所需的所有命令。这是 class:

的原型 header
#include <string.h>
#include <fstream>
#include <iostream>

#include <Eigen/Dense>

....

class FileLogger {
 public:
  FileLogger(const std::string& log_name, const std::string& columnNames, const uint& columnCount, const double& timerOffsetSeconds = 0);

  // Checks if logging of previous timestamp is completed and 
  //starts a new row with logging the current time. 
  void startNewTimestamp();

  // different predefined methods to log several data types
  void logScalar(const double& value);
  void logVector(const Eigen::VectorXd& values);

  template <int SIZE, typename TYPE>
  void logArray(TYPE (&values)[SIZE]) {
    for (int i; i < SIZE; i++) {
      fileHandle_ << values[i] << ",";
      currentColumnCount_ += 1;
    }
  }

  // Method to close the fileHandle_ of the class
  void closeFileHandle();

 private:
  void checkLastTimestampCompletion();
  uint countColumnNames();

  std::string file_name_;
  uint currentColumnCount_;
  const uint columnCount_;
  const std::string columnNames_;

  std::ofstream fileHandle_;

  ....
};

我现在遇到的问题是,每个 class 都需要在程序终止之前使用方法 closeFileHandle() 关闭它的 fileHandle_ 以获得工作日志。由于程序通常使用 CTL +C 终止,这需要在信号回调中发生。我发现终止信号可用于执行回调函数,如下所示:

...
#include <signal.h>
#include <iostream>

void signal_callback_handler(int signum) {
  std::cout << "Caught signal " << signum << ", starting exit procedure." << std::endl;
  .... do something ...
  exit(1);
}

int main(){
  .... 
  signal(SIGINT, signal_callback_handler);
  ....
}

我能找到的关闭每个 FileLogger class 实例的所有必需 fileHandle_ 的唯一方法是全局定义它们并手动将 fileLogger.closeFileHandle(); 添加到回调函数。由于多种原因,这是不可取的。

因此,我想知道是否有一种方法可以在 class 本身中以某种方式包含在退出程序时关闭文件句柄的功能,从而 class 可以被实例化代码中的任何地方?或者,如果那不可能,我该如何以其他方式处理问题?

销毁每个 FileLogger 会自动解决这个问题,因为 fileHandle_ 将在 FileLogger 超出范围或调用 std::exit 时关闭。