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 に答える