专门为GUID值设置模板

Bru*_*nez 3 c++ com templates clsid

这是为什么不是来自常量POD对象常量的字段?

来自库的头声明了类GUID

static const GUID CLSID_EH264VD = 
{ 0x96b9d0ed, 0x8d13, 0x4171, { 0xa9, 0x83, 0xb8, 0x4d, 0x88, 0xd6, 0x27, 0xbe } };
Run Code Online (Sandbox Code Playgroud)

我想编写一个直接从dll创建对象的函数,而不需要注册dll,因此我需要将每个CLSID映射到dll名称.就像是

Create<CLSID_EH264VD>()
Run Code Online (Sandbox Code Playgroud)

这将取决于专业化,如

template<>
struct dll<CLSID_EH264VD>
{
    char const* filename = ""mc_dec_avc_ds.ax";
}
Run Code Online (Sandbox Code Playgroud)

因此尝试使用未知的dll实例化未注册的类是一个编译时错误.

问题是模板不能专门用于GUID.链接的问题说constexpr允许以允许特化的方式声明GUID,但Visual C++不支持最新版本(2012)中的constexpr.任何解决方法?

And*_*owl 6

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

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

- 对于整数或枚举类型的非类型模板参数,模板参数类型的转换常量表达式(5.19); 要么

- 非类型模板参数的名称; 要么

- 一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的对象的地址,或具有外部或内部链接的函数,[...]

- [...]

这意味着即使它GUID本身不能用作模板参数,您也可以使用global 的地址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;
Run Code Online (Sandbox Code Playgroud)