c++ - 防止字符串文字被转换为 bool 与 std::string
问题描述
之前也有人问过类似的问题,例如String 文字匹配 bool 重载而不是 std::string。
但我想知道的是,C++ 开发人员应该怎么做才能防止这种情况发生?作为编写 C++ 库供他人使用的人,我应该怎么做才能确保不会发生这种情况?这是我今天遇到的示例,其中一个库有两种initialize()
方法:
void initialize(bool someflag) { /* ... */ }
void initialize(const std::string & name) { /* ... */ }
现在有问题的代码出现在想要利用此功能并以类似于以下方式调用它的应用程序中:
initialize("robert");
乍一看,你会认为这会调用initialize(string)
,但它实际上调用了第initialize(bool)
一个布尔标志设置为 true 的函数!
是的,我知道可以这样解决:
initialize( std::string("robert") );
但这使呼叫者承担了责任。
编辑@zdan:我不认为其他链接问题中的“解决方案”是很好的解决方案,因为1)我希望不必添加const char *
每个采用布尔或字符串的方法的版本,以及2)模板解决方案显着提高了受影响方法的代码可维护性,使它们几乎不可读。
解决方案
我应该怎么做才能确保不会发生这种情况?
一种可能性是创建一个接受 a 的重载char const*
并将其传递给接受 a 的重载std::string
。
void initialize(char const* name) { initialize(std::string(name)); }
推荐阅读
- ruby-on-rails - Rails ActiveRecord 使用 SQL 函数作为创建属性的值
- python-3.x - 如何使用beautifulsoup从python中的url中抓取数据
- python - 带有数组输入的 pandas 中的矢量化
- powershell - 使用powershell将目录复制到远程计算机
- sql - Sqlite 查询检索由于某一列而发生变化的所有记录
- amazon-web-services - 带有 KMS 加密密码的 MySQL 用户名和密码的 Terraform 列表
- twilio - Twilio 使用 LocalAudioTrack 发送自定义音频字节
- iphone - 如何在 Ionic 中编辑 iPhone UX 中的可检查项目列表?
- c++ - 创建加密安全密码。并验证它是否有效
- python - 画布未绑定到类中的鼠标按钮,tkinter-Python3