Non sapendo com'è fatto sto singleton ho azzardato questo. Da notare che la chiamata a Init() avviene una sola volta
prima del main.
(E' lo stesso sistema usato dalla libreria C++ per std::cout e std::cin)
Singleton.h
static struct SingInit {
SingInit();
~SingInit();
static int cnt;
} singInit;
class Singleton {
friend struct SingInit;
public:
static Singleton& instance() {
return sing2;
}
protected:
static void init();
static Singleton& sing2;
};
Singleton.cpp
#include <iostream>
#include <fstream>
#include <new>
#include <type_traits>
#include "single.h"
int SingInit::cnt;
typename std::aligned_storage_t<sizeof(Singleton), alignof(Singleton)> SingStore;
Singleton& Singleton::sing = reinterpret_cast<Singleton&>(SingStore);
SingInit::SingInit() {
if (SingInit::cnt++ == 0) {
new (&Singleton::sing) Singleton();
Singleton::sing.init();
}
}
SingInit::~SingInit() {
if (--SingInit::cnt == 0)
(&Singleton::sing)->~Singleton();
}
void Singleton::init() {
std::ifstream ifs("file_di_configurazione");
std::cout << ifs.rdbuf();
}