处理模棱两可的类型转换/转换的正确方法是什么?

What is correct way to deal with ambiguous typecasting/conversions C++11

本文关键字:方法 是什么 转换 模棱两可 类型转换 处理      更新时间:2023-10-16

我有类似这样的代码:

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)来调用。

I can not do constructor explicit .

I tried to do:

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"是一个打字错误)听起来对我来说也是一个好主意。你为什么做不到呢?

您可以将构造函数设置为explicit

explicit Pair(const void *blob) { ... }

,

p.cmp("Hello");

解析为

int cmp(const std::string &key) const;