c++ - 处理模棱两可的类型转换/转换 C++11 的正确方法是什么

标签 c++ c++11 casting

我有类似的代码:

class Pair{
public:
    Pair(const void *blob);
    //...
    int cmp(const std::string &key) const;
    int cmp(const Pair &pair) const;
}

稍后如果我这样做:

Pair p = ...;
p.cmp("Hello");

它不会编译,因为从 const char * 的转换是不明确的。

可以翻译成std::stringcmp(std::string)来调用,或者...

可以翻译成Paircmp(const Pair)来调用。

我不能做构造函数explicit

我尝试过:

Pair(const char *blob) = deleted;

但是我不能用 nullptr 构造类,我希望能够这样做。

作为最终解决方案,我定义了以下方法:

int cmp(const char *key) const{
   return cmp( std::string{ key } );
}

而且效果很好。

是否有更好的方法来处理此类转换?

最佳答案

我觉得你的“最终解决方案”非常好。不构建临时也将有助于提高性能。如果已知您的字符串不包含 NUL 字符,则可以实现以 std::string 作为参数的版本

inline int
cmp(const std::string& s)
{
  return this->cmp(s.c_str());
}

这太简单了,不用担心。

使 Pair 的构造函数 explicit(我认为“implicit”是一个打字错误)对我来说也是个好主意。为什么你做不到?

关于c++ - 处理模棱两可的类型转换/转换 C++11 的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32573556/

相关文章:

c++ - 内部类模板循环引用

复合赋值运算符的 C++ 概念

c++ - 我可以为 C++11 std::tuple 预分配一 block 内存吗?

c++ - typedef 和枚举或枚举类

c++将 union 转换为其成员类型之一

c++ - 访问 vector 中的实例时,shared_ptr 的 vector 给出段错误

c++ - 通过容器的 protected 继承来 boost foreach

C++ 将 std::vector<Derived>* 转换为 std::vector<Base> ...?

winapi - 更改环境值后Innosetup SendMessage

c - 当我把它放在一个 char 数组中时,unsigned char 没有出现在 printf 中