这是后续为什么常量 POD 对象中的字段本身不是常量? https://stackoverflow.com/questions/15392553/why-arent-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。有什么解决办法吗?
根据 C++11 标准第 14.3.2/1 段:
非类型、非模板模板参数的模板参数应为one of:
— 对于整型或枚举类型的非类型模板参数,转换后的常量表达式
(5.19) 模板参数的类型;或者
— 非类型模板参数的名称;或者
— 常量表达式 (5.19) 指定具有静态存储持续时间的对象的地址和
外部或内部链接或具有外部或内部链接的功能,[...]
— [...]
这意味着即使GUID
本身不能用作模板参数,您可以使用address全球的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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)