C++ 计算#定义的简明方法

C++ 计算#定义的简明方法,c++,switch-statement,c-preprocessor,C++,Switch Statement,C Preprocessor,我在生成的标题中有一组#define,如下所示: #define SFX_SOIL_DESTROY_1 2 #define SFX_SOIL_DESTROY_2 14 #define SFX_SOIL_PLACE_1 32 #define SFX_SOIL_PLACE_2 33 #define SFX_WOOD_DESTROY_1 5 我有一个方法,它必须返回材质类型和声音类型的正确定义。下面是一个冗长而不精确的解决方案: int getSfx (MaterialType material,

我在生成的标题中有一组#define,如下所示:

#define SFX_SOIL_DESTROY_1 2
#define SFX_SOIL_DESTROY_2 14
#define SFX_SOIL_PLACE_1 32
#define SFX_SOIL_PLACE_2 33
#define SFX_WOOD_DESTROY_1 5
我有一个方法,它必须返回材质类型和声音类型的正确定义。下面是一个冗长而不精确的解决方案:

int getSfx (MaterialType material, SoundType sound)
{
     switch (material)
     {
         case SOIL:
         {
             switch (sound)
             {
                 case DESTROY:
                     return rand()%2 ?  SFX_SOIL_DESTROY_1 : SFX_SOIL_DESTROY_2;
                 case PLACE:
                 // And so on

是否有某种宏黑客可以浓缩这一点?非常感谢您的帮助。

将其存储为数据查找速度更快,只需处理一次(设置时)。因此,假设材质和声音或多或少是基于零的顺序(否则执行查找转换):

然后:

int getSfx (MaterialType material, SoundType sound)
{
    return soundLut [material][sound][rand()%2];
}

将其存储为数据查找要快得多,并且只需要处理一次(设置时)。因此,假设材质和声音或多或少是基于零的顺序(否则执行查找转换):

然后:

int getSfx (MaterialType material, SoundType sound)
{
    return soundLut [material][sound][rand()%2];
}

将其存储为数据查找要快得多,并且只需要处理一次(设置时)。因此,假设材质和声音或多或少是基于零的顺序(否则执行查找转换):

然后:

int getSfx (MaterialType material, SoundType sound)
{
    return soundLut [material][sound][rand()%2];
}

将其存储为数据查找要快得多,并且只需要处理一次(设置时)。因此,假设材质和声音或多或少是基于零的顺序(否则执行查找转换):

然后:

int getSfx (MaterialType material, SoundType sound)
{
    return soundLut [material][sound][rand()%2];
}

也许你可以使用一个与@Mike非常相似的解决方案来实现这个目的(但可能更安全一些)

void initialize()
{
//这是你们班的成员。
//标准:映射<标准::对,标准::对>sfxs;
sfxs[std::make_pair(土壤,破坏)]=std::make_pair(SFX_土壤,破坏1,SFX_土壤,破坏2);
sfxs[std::make_pair(土壤,场所)]=std::make_pair(SFX_土壤,场所,场所1,SFX_土壤,场所,场所2);
// ...
}
int getSfx(材料类型A材料,声音类型A声音)
{
const auto key=std::make_pair(一种材质,一种声音);
if(sfxs.find(key)!=sfxs.end())
{
返回(rand()%2)?(sfxs[key].first):(sfxs[key].second);
}
返回-1;
}

也许您可以使用与@Mike非常类似的解决方案(但可能更安全一点)来实现此目的

void initialize()
{
//这是你们班的成员。
//标准:映射<标准::对,标准::对>sfxs;
sfxs[std::make_pair(土壤,破坏)]=std::make_pair(SFX_土壤,破坏1,SFX_土壤,破坏2);
sfxs[std::make_pair(土壤,场所)]=std::make_pair(SFX_土壤,场所,场所1,SFX_土壤,场所,场所2);
// ...
}
int getSfx(材料类型A材料,声音类型A声音)
{
const auto key=std::make_pair(一种材质,一种声音);
if(sfxs.find(key)!=sfxs.end())
{
返回(rand()%2)?(sfxs[key].first):(sfxs[key].second);
}
返回-1;
}

也许您可以使用与@Mike非常类似的解决方案(但可能更安全一点)来实现此目的

void initialize()
{
//这是你们班的成员。
//标准:映射<标准::对,标准::对>sfxs;
sfxs[std::make_pair(土壤,破坏)]=std::make_pair(SFX_土壤,破坏1,SFX_土壤,破坏2);
sfxs[std::make_pair(土壤,场所)]=std::make_pair(SFX_土壤,场所,场所1,SFX_土壤,场所,场所2);
// ...
}
int getSfx(材料类型A材料,声音类型A声音)
{
const auto key=std::make_pair(一种材质,一种声音);
if(sfxs.find(key)!=sfxs.end())
{
返回(rand()%2)?(sfxs[key].first):(sfxs[key].second);
}
返回-1;
}

也许您可以使用与@Mike非常类似的解决方案(但可能更安全一点)来实现此目的

void initialize()
{
//这是你们班的成员。
//标准:映射<标准::对,标准::对>sfxs;
sfxs[std::make_pair(土壤,破坏)]=std::make_pair(SFX_土壤,破坏1,SFX_土壤,破坏2);
sfxs[std::make_pair(土壤,场所)]=std::make_pair(SFX_土壤,场所,场所1,SFX_土壤,场所,场所2);
// ...
}
int getSfx(材料类型A材料,声音类型A声音)
{
const auto key=std::make_pair(一种材质,一种声音);
if(sfxs.find(key)!=sfxs.end())
{
返回(rand()%2)?(sfxs[key].first):(sfxs[key].second);
}
返回-1;
}

您说头文件已生成。您是否也考虑过生成“长而不精确的解决方案”@zwol定义是从外部工具生成的,因此我无法编辑该工具。另一方面,我并不反对编写一个预处理器黑客或者类似的东西来“生成”这个长而不精确的方法。我更倾向于使用一个额外的工具来生成你需要的代码。一次性代码生成器是一种被低估的技术。在我的例子中,我也可以使用类似shell脚本的代码来生成代码,但是对于这个问题,既然已经有了答案,我们就只支持C++。您是否也考虑过生成“长而不精确的解决方案”@zwol定义是从外部工具生成的,因此我无法编辑该工具。另一方面,我并不反对编写一个预处理器黑客或者类似的东西来“生成”这个长而不精确的方法。我更倾向于使用一个额外的工具来生成你需要的代码。一次性代码生成器是一种被低估的技术。在我的例子中,我也可以使用类似shell脚本的代码来生成代码,但是对于这个问题,既然已经有了答案,我们就只支持C++。您是否也考虑过生成“长而不精确的解决方案”@zwol定义是从外部工具生成的,因此我无法编辑该工具。另一方面,我并不反对编写一个预处理器黑客或者类似的东西来“生成”这个长而不精确的方法。我更倾向于使用一个额外的工具来生成你需要的代码。一次性代码生成器是一种被低估的技术。在我的例子中,