将模板专门化为GUID值
Specialize a template for a GUID value
这是为什么常量POD对象的字段本身不是常量?
库的头文件声明了像
这样的类guidstatic 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段:
非类型、非模板模板形参的模板实参必须是:
中的—对于整型或枚举型的非类型模板形参,转换后的常量表达式(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";};
}
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 从 GUID 获取 USB 卷路径
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- ActiveDirectory/C++: 如何将 Guid 转换为用户名?
- 如何使用模板化类专门化模板化函数?
- 更改用于部署的凭据提供程序 GUID 的过程
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在 std::p air 中使用 System::Guid 和自定义枚举?
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 将字符串强制转换为GUID并不能得到正确的结果
- 如何在编译时专门化大型模板函数中的小部分