Использование уровня абстракции ОС на основе указателя функции без одноэлементного

#c #singleton

Вопрос:

Поэтому я рассматриваю фреймворк, который позволяет использовать уровень абстракции ОС следующим образом:

 struct OSDK_OSAL {
    // Function that should create a mutex
    OsdkStat (*MutexCreate)(OsdkMutexHandle *mutex);
    // A bunch of other similar function pointers
    ...

// A function to register your OSAL into the singleton OS resource handler
#define REG_OSAL_HANDLER(handlerPtr)                            
  OSDK::Platform::instance().registerOsalHandler(handlerPtr)
 

Этот уровень абстракции позволяет вам контролировать:

  • Создание потока
  • Создание мьютексов, блокировка и т. Д
  • … Куча других вещей

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

Я заинтересован в переопределении этого OSAL, но я надеялся избежать повторения одноэлементного шаблона. Я надеялся на что-то подобное:

 class OSAL {
   public: 
       OsdkStat MutexCreate(OsdkMutexHandle *mutex) {
           // Create a normal c  11 mutex
           // register it in our list of mutex's
       }

    private:
        LockFreeList mutex_list;
};
 

Тогда я бы настроил его аналогично:

 int main() {
    OSAL my_osal;
    OSDK_OSAL osal_func_set = {
        .MutexCreate = [amp;my_osal](auto mutex) { return my_osal.MutexCreate(mutex); };
    }
    REG_OSAL_HANDLER(amp;osal_func_set);

    ... 

    // Get on with my life, no initialisation order fiasco etc. 
 

Но, очевидно, я не могу этого сделать, потому что это указатель на функцию, и он не может содержать никакого состояния …

Таким образом, решение, по-видимому, заключается в следующем:

 // Make a crappy singleton, at least it is not global
OSALamp; osal_instance() {
   static OSAL osal;
   return osal;
}

// This replaces the lambda in the struct initialization
OsdkStat g_MutexCreate(OsdkMutexHandle *mutex) {
    return osal_instance().MutexCreate(mutex);
}
 

Есть ли способ сделать это без синглтона?