3

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

库中的标头声明类 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。任何解决方法?

4

2 回答 2

6

根据 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;
于 2013-03-14T13:44:17.940 回答
0

你可以试试

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";};
}
于 2013-03-14T13:41:01.120 回答