Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为GUID值专门化模板_C++_Templates_Com_Clsid - Fatal编程技术网

C++ 为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() 这取决于专业化,

这是一个后续行动

库中的头声明类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()
这取决于专业化,例如

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++实现新标准的这一部分。