Это продолжение до Почему поля сами по себе не являются константами из констант 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). Любое решение?
Согласно пункту 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;
Вы можете попробовать
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";};
}