我如何确保在有多个候选函数的情况下调用正确的函数

How can I ensure that correct function is called in case there are multiple candidates

本文关键字:候选函数 情况下 调用 函数 何确保 确保      更新时间:2023-10-16

在c++中是完全合法的:

bool x = "hi";

因为"hi"被编译器翻译成一个char数组,并返回一个指向该数组的指针,该指针是一个数字,而数字可以隐式地转换为bool(0为假,其他为真)。

所以我有这些:

Exception(QString Text, bool __IsRecoverable = true);
Exception(QString Text, QString _Source, bool __IsRecoverable = true);

遗憾的是我发现打电话

Exception *e = new Exception("error happened", "main.cpp @test");

它创建了一个使用Exception(QString Text, bool __IsRecoverable = true);构造函数创建的"Exception"类的新实例,这是错误的。

是否有一种简单的方法来确保正确的函数被调用,而不是完全重构构造函数,改变参数的位置,等等?

首先,我不确定为什么要动态分配一个异常类。我不确定这是个好主意。

你可以显式地构造一个QString:

Exception e("error happened", QString("main.cpp @test"));

或者你可以传递第三个参数:

Exception e("error happened", "main.cpp @test", true);

或者您可以添加一个附加的构造函数,它接受const char*,并且将优先于转换为bool:

Exception(QString Text, const char* Source, bool IsRecoverable = true);

您可以轻松地将其转发到QString版本。还要注意,以下划线和大写字母开头或以两个下划线开头的名称是保留的。

我的建议是不要使用默认参数。它们导致了像这样的重载解析问题,无论如何,仅仅将true视为参数并不是很好读。阅读代码的人必须停下来查找true的含义。即使是你自己,你也可能在几个月的时间里当你回到代码时忘记它,特别是如果你经常做这类事情。

例如:

struct Exception: public whatever
{
    Exception(char const *text);
    Exception(char const *text, char const *source);
};
struct RecoverableException: public Exception
{
    RecoverableException(char const *text);
    RecoverableException(char const *text, char const *source);
};

在这个源文件中输入的内容要多一些,但回报是实际使用异常的代码更简单、更清晰。

要实现这些构造函数,你可以让它们都调用.cpp文件中的特定函数,并带相关参数选择你想要的行为。

我更喜欢使用char const *而不是QString,因为我对两件事很偏执:

  • 不必要的转换
  • 内存分配失败

如果构造一个QString抛出,那么事情很快就会走下坡路。但是你可以选择不担心这种可能性,因为如果系统内存耗尽,而你的异常处理没有为这种可能性做好准备,那么无论如何它都会终止。

相关文章: