#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);
}
Есть ли способ сделать это без синглтона?