专门为GUID值设置模板

时间:2013-03-14 13:35:57

标签: c++ templates com clsid

这是Why aren't fields from constant POD object constants themselves?

的后续行动

库中的标头声明了像

这样的类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 ++不支持最新版本(2012)中的constexpr。任何解决方法?

2 个答案:

答案 0 :(得分:6)

根据C ++ 11标准的第14.3.2 / 1段:

  

非类型非模板模板参数的模板参数应为 之一:

     

- 对于整数或枚举类型的非类型模板参数,转换的常量表达式   (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;

答案 1 :(得分:0)

您可以尝试

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";};
}