C++ if语句备选方案

Ton*_*ion 3 c++

是我,还是看起来C++要求更多地使用'if'语句然后C#?

我有这个代码库,它包含很多这样的东西:

if (strcmp((char*)type,"double")==0)
Run Code Online (Sandbox Code Playgroud)

当有太多if语句时,我想知道它是不是有点'代码味道'?

我不是说不好,但是字符串比较之类的东西,涉及到很多字符串,它们不能以不同的方式完成吗?

是否只能编写if语句的序列?

这只是一个例子,它可以是任何一种IF语句,而不是:

if (string a == "blah") then bla
if (string b == "blah") then blo
Run Code Online (Sandbox Code Playgroud)

Mik*_*one 13

你这样做的原因if (strcmp((char*)type,"double")==0)是因为你不能使case-expression成为"double"并使用switch语句.也就是说,如果你正在做很多这种类型的字符串匹配,你可能想看看使用std::map<std::string, int>类似的东西,然后使用map将字符串转换为你然后输入的索引switch.

就个人而言,在这些情况下,我喜欢这样的东西std::map<std::string, int (Handler::*)(void)>,它让我创建类方法的处理程序映射,但是YMMV.

编辑:我忘了提到:有一个方法字符串映射的另一个好处是你可以在运行时改变(通常添加)它.例如,解析器在知道它正在解析哪种文件后,可以在运行时更改其关键字及其处理程序列表.


utn*_*tim 5

这是代码味道.

为了最小化它,你应该(在这种情况下)使用std::strings.然后你的代码变成:

#include <string>
// [...]
std::string type = "whatever";
// [...]
if (type == "double")
Run Code Online (Sandbox Code Playgroud)

这与C#等价物几乎完全相同:在C#代码中编译此示例代码只需删除includestd::.

通常,如果您发现在C++中直接使用char*的代码通常会做错(除了一些罕见的例外).

编辑:Mike DeSimone在他的回答中解决了进一步重构的问题(所以我不会在这里提及:)).