Специализируйте шаблон для значения GUID

Это продолжение до Почему поля сами по себе не являются константами из констант POD?

Заголовок из библиотеки объявляет идентификаторы GUID класса, такие как

static const GUID CLSID_EH264VD =
{ 0x96b9d0ed, 0x8d13, 0x4171, { 0xa9, 0x83, 0xb8, 0x4d, 0x88, 0xd6, 0x27, 0xbe } };

Я хочу написать функцию, которая создает объект непосредственно из DLL, не требуя регистрации DLL, поэтому мне нужно сопоставить каждый CLSID с именем DLL. Что-то вроде

Create<CLSID_EH264VD>()

которая будет зависеть от специализации, такой как

template<>
struct dll<CLSID_EH264VD>
{
char const* filename = ""mc_dec_avc_ds.ax";
}

так что это ошибка времени компиляции, чтобы попытаться создать незарегистрированный класс с неизвестной DLL.

Проблема в том, что шаблоны не могут быть специализированы для GUID. В связанном вопросе говорится, что constexpr позволит объявлять GUID таким образом, который допускает специализацию, но Visual C ++ не поддерживает constexpr в последней версии (2012). Любое решение?

3

Решение

Согласно пункту 14.3.2 / 1 стандарта C ++ 11:

Шаблонный аргумент для не типового, не шаблонного шаблона-параметра должен быть один из:

— для нетипового шаблона-параметра целочисленного типа или типа перечисления — преобразованное константное выражение
(5.19) типа шаблона-параметра; или же

— имя нетипового шаблона-параметра; или же

— константное выражение (5.19), которое обозначает адрес объекта со статической продолжительностью хранения и
внешняя или внутренняя связь
или функция с внешней или внутренней связью, […]

— […]

Это означает, что хотя GUID сам не может быть использован в качестве аргумента шаблона, вы можете использовать адрес глобального GUID в качестве аргумента и указателя на GUID в качестве соответствующего нетипичного параметра:

template<GUID const* pGuid>
struct dll { };

template<>
struct dll<&CLSID_EH264VD>
//       ^^^^^^^^^^^^^^
//       This is a constant expression
{
char const* filename = ""mc_dec_avc_ds.ax";
}

// ...

dll<&CLSID_EH264VD> x;
6

Другие решения

Вы можете попробовать

template<size_t B1,size_t B2,size_t B3,size_t B4,size_t B5,size_t B6,size_t B7,size_t B8,size_t B9,size_t B10>
class clsid_t{};

typedef clsid_t<0x96b9d0ed, 0x8d13, 0x4171,  0xa9, 0x83, 0xb8, 0x4d, 0x88, 0xd6, 0x27, 0xbe> CLSID_EH264VD;

template<>
struct dll<CLSID_EH264VD>
{
char const* static name(){return "mc_dec_avc_ds.ax";};
}
0

По вопросам рекламы [email protected]