Здравствуйте orangy, Вы писали:
[skip]
O>У нас возникла идея альтернативного подхода к этому вопросу, а именно использование traits. Сущность идеи, конечно, не нова, но я ни разу не видел использования этого в наличествующих библиотеках именно для работы с платформами.
O>Итак, немного [псевдо]кода:
O>O>typedef enum
O>{
O> win32, win32_ce, linux, /* другие платформы */
O>#if defined(_WIN32)
O> #define PLATFORM_WIN32
O> platform = win32
O>#elif defined(_WIN32_WCE)
O> #define PLATFORM_WIN32_CE
O> platform = win32_ce
O>#elif /* другие платформы */
O>#else
O> #error defaults not correct; you must hand modify platform_def.h
O>#endif
O>} platform_type;
O>
ИМХО, ты на верном пути. Только мне кажется, что лучше идентификаторы платформ поместить не в enum, а сделать их в виде Dummy-классов.
Попробуй сделать так:
class PlatformWin32; // Всё. У этого класса никакого тела не будет.
class PlatformLinux; // У этого - тоже.
#ifdef PLATFORM_WIN32
typedef PlatformWin32 CurrentPlatform;
#else
...
#endif
// Определения шаблонов платформозависимых классов:
template<typename PLATFORM, typename Tr = type_trait<PLATFORM> >
class mutex_trait { ... };
// Специализация
template<>
class mutex_trait<PlatformLinux> { ... };
template<>
class mutex<PlatformLinux> { ... }
// Использование в платформонезависимом коде:
mutex<CurrentPlatform> some_mutex;
// И т.д.
Специализации можно раскидать по отдельным инклюдникам как и в предлагаемом тобой варианте.
[skip]
O>Что думает уважаемое С++-сообщество по этому поводу?
"Я вам не скжу за всю Одессу"
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!