防止将字符串文字与std :: string

时间:2019-07-18 19:48:43

标签: c++ implicit-conversion

之前曾问过类似的问题,例如String literal matches bool overload instead of std::string

但是我想知道C ++开发人员应该怎么做才能防止这种情况的发生?作为编写C ++库供他人使用的人,我应该怎么做才能确保不会发生这种情况?这是我今天遇到的示例,其中一个库具有2个initialize()方法:

void initialize(bool someflag) { /* ... */ }
void initialize(const std::string & name) { /* ... */ }

现在有问题的代码存在于想要利用此功能的应用程序中,并以类似于以下方式的方式对其进行了调用:

initialize("robert");

乍一看,您会认为这会调用initialize(string),但实际上它会调用布尔值设置为true的第一个initialize(bool)

是的,我知道可以通过以下方式解决此问题:

initialize( std::string("robert") );

但这会给调用者带来麻烦。


为@zdan编辑:自从1)我不认为其他链接的问题中的“解决方案”是很好的解决方案,因为我希望不必为每个方法的const char *版本添加一个bool或字符串,以及2)模板解决方案显着提高了受影响方法的代码可维护性,使它们几乎不可读。

1 个答案:

答案 0 :(得分:4)

  

我该怎么做才能确保不会发生这种情况?

一种可能性是创建一个接受char const*的重载,并将其传递给接受std::string的重载。

void initialize(char const* name) { initialize(std::string(name)); }