C++ 为GUID值专门化模板
这是一个后续行动 库中的头声明类GUID,如C++ 为GUID值专门化模板,c++,templates,com,clsid,C++,Templates,Com,Clsid,这是一个后续行动 库中的头声明类GUID,如 static const GUID CLSID_EH264VD = { 0x96b9d0ed, 0x8d13, 0x4171, { 0xa9, 0x83, 0xb8, 0x4d, 0x88, 0xd6, 0x27, 0xbe } }; 我想编写一个函数,直接从dll创建一个对象,而不需要注册dll,因此我需要将每个CLSID映射到dll名称。差不多 Create<CLSID_EH264VD>() Create() 这取决于专业化,
static const GUID CLSID_EH264VD =
{ 0x96b9d0ed, 0x8d13, 0x4171, { 0xa9, 0x83, 0xb8, 0x4d, 0x88, 0xd6, 0x27, 0xbe } };
我想编写一个函数,直接从dll创建一个对象,而不需要注册dll,因此我需要将每个CLSID映射到dll名称。差不多
Create<CLSID_EH264VD>()
Create()
这取决于专业化,例如
template<>
struct dll<CLSID_EH264VD>
{
char const* filename = ""mc_dec_avc_ds.ax";
}
模板
结构dll
{
char const*filename=”“mc_dec_avc_ds.ax”;
}
因此,尝试用未知dll实例化未注册的类是编译时错误
问题是模板不能为GUIDs专门化。链接的问题表明,COSTEXPRO将允许以允许专业化的方式声明GUID,但是Visual C++不支持最新版本(2012)中的CONTXPR。任何解决办法? < P>您可以尝试
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";};
}
模板
类clsid_t{};
类型定义clsid_t clsid_EH264VD;
模板
结构dll
{
char const*static name(){返回“mc_dec_avc_ds.ax”;};
}
根据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;
模板
结构dll{};
模板
结构dll
// ^^^^^^^^^^^^^^
//这是一个常量表达式
{
char const*filename=”“mc_dec_avc_ds.ax”;
}
// ...
动态链接库x;
为什么在编译时需要映射?std::(无序)有什么问题map
?@Xeo试图从未知dll创建对象时,我希望出现编译时错误。我无法更改CLSID_EH264VD的定义方式。@BrunoMartinez您不能更改,因为没有理由修改它,或者因为它被用作GUID
类型的变量,因为它位于外部库中。vs2012和gcc 4.7.2(cygwin)抱怨内部链接与非类型参数不兼容。@BrunoMartinez:嗯,这有点违背我上面引用的标准段落中粗体的句子。这些编译器可能在这方面不兼容。你能把那些GUID
s设为非const
?这将给他们提供外部链接。我刚刚尝试了clang,它确实用static编译了代码。我将不得不等到vc++实现新标准的这一部分。