C++ 链接两个枚举类型成员

C++ 链接两个枚举类型成员,c++,class,hyperlink,enums,directx,C++,Class,Hyperlink,Enums,Directx,我正在包装IDirect3D8类,重新实现它,并使用DXGI枚举适配器模式。问题来了 D3DDISPLAYMODE的Format成员要求它是D3DFORMAT枚举类型的成员,尽管IDXGIOutput::GetDisplayModeList返回的显然是DXGI_格式枚举类型的成员,这与D3DFORMAT完全不同。我需要将DXGI_格式的成员链接到D3DFORMAT成员 我的第一个想法是编写一个函数来检查类型并将其重定向到适当的D3DFORMAT成员,但这不是一个很好的想法,因为D3DFORMAT

我正在包装IDirect3D8类,重新实现它,并使用DXGI枚举适配器模式。问题来了

D3DDISPLAYMODE的Format成员要求它是D3DFORMAT枚举类型的成员,尽管IDXGIOutput::GetDisplayModeList返回的显然是DXGI_格式枚举类型的成员,这与D3DFORMAT完全不同。我需要将DXGI_格式的成员链接到D3DFORMAT成员


我的第一个想法是编写一个函数来检查类型并将其重定向到适当的D3DFORMAT成员,但这不是一个很好的想法,因为D3DFORMAT中有67个成员。然后我想到了一个想法,我可以有一个数组,它的索引将是DXGI_格式成员的值,它们的值将是相应的D3DFORMAT成员,但我不确定-可能有更好的方法,我会浪费时间。有更好或更简单的方法吗?

您是否真的需要此映射取决于您的具体实现。然而,我找不到更好的方法来映射这些枚举数。静态数组常量比std::map或std::multimap更节省内存和运行时,因为键/索引是连续的,键和值都只需要8-32位。 但是初始化数组常量可能比动态地将值放入映射或数组中更容易出错

为避免错误,请使用等于实际数组索引的值对键进行注释

const D3DFORMAT dxgi_d3d_format_mapping[] = {
    /*DXGI_FORMAT_UNKNOWN*/                   D3DFMT_UNKNOWN,
    /*DXGI_FORMAT_R32G32B32A32_TYPELESS*/     D3DFMT_A32B32G32R32F,
    //.
    //.
    //.
};
。。。或者,如果可用,请使用C99语法,在这种情况下,最好使用C99语法:

const D3DFORMAT dxgi_d3d_format_mapping[] = {
    [DXGI_FORMAT_UNKNOWN]                = D3DFMT_UNKNOWN,
    [DXGI_FORMAT_R32G32B32A32_TYPELESS]  = D3DFMT_A32B32G32R32F,
    //.
    //.
    //.
};
用法是显而易见的,但索引检查可能不会有什么坏处:

assert( 0 <= dxgi_fmt && dxgi_fmt < (sizeof(dxgi_d3d_format_mapping)/sizeof(D3DFORMAT)) );
D3DFORMAT d3d_fmt = dxgi_d3d_format_mapping[dxgi_fmt];