C++に対するMicrosoft固有の拡張機能を使用するコードがあります。
interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904"))
ICalculator : public IUnknown
{
//...
};
この文は何に拡張されますか?どうすればANSIC++で書き直すことができますか?
C++に対するMicrosoft固有の拡張機能を使用するコードがあります。
interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904"))
ICalculator : public IUnknown
{
//...
};
この文は何に拡張されますか?どうすればANSIC++で書き直すことができますか?
これはマクロではないため、何にも「拡張」されません。これは、オブジェクトファイルメタデータ内の特定のUUIDで型を装飾するだけであり、後で__uuidof演算子を使用して抽出できます。
GUIDをインターフェイスに静的に「アタッチ」する必要がある場合は、テンプレート(トレイト)を使用することもできます。検討:
一般的なhファイルで、空の特殊化されていないテンプレートを作成します。
template<typename TInterface> struct TInterfaceTraits {}
インターフェイスを定義するときは、そのためのテンプレートの特殊化を記述します(または、使用直前を含む他の場所に記述できます)。
class ICalculator : public IUnknown
{
//...
};
template<> struct TInterfaceTraits<class ICalculator > {
static GUID guid() {
return IID_ICalculator ;
}
};
次に、uuidを取得するには、次のように記述します。
ICalculator *pCalcFace;
pObject->QueryInterface(TInterfaceTraits<ICalculator>::guid(), (void**)pCalcFace);
当然のことながら、QueryInterfaceにテンプレートラッパーを作成できます(これは、トレイトを使用して適切なGUIDを自動的に提供します。これにより、さらに使いやすくなります。
ICalculator *pCalcFace = QueryInterface<ICalculator>(pObject);