gpt4 book ai didi

C++:我可以做一个赋值运算符 "explicit"吗

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:58 25 4
gpt4 key购买 nike

我的任务是迁移 C++ 类库中的错误处理概念。以前简单返回 bool(成功/失败)的方法应修改为返回一个 Result 对象,该对象传达机器可读的错误代码和人类可读的解释(以及更多在这里无关紧要的内容)。

遍历数千行代码很容易出错,因此我尝试从编译器获得对此任务的最佳支持。

我的结果类在其他成员方法中有一个从代码构造结果的构造函数和代码的赋值运算符:

class Result
{
public:
typedef unsigned long ResultCode;
explicit Result(ResultCode code); // (1)
Result& operator=(ResultCode code); // (2)
};

备注:我通常会为 ResultCode 使用一个枚举类来解决我的问题,但这不是一个选择。这是因为主要的设计目标是在不同的库中使用 Result,每个库都应定义自己的一组结果代码,而不需要一个为所有库定义所有可能的结果代码的大头文件。事实上,每个类都应该能够定义本地结果代码,以便可以从类头中获得可能的结果代码列表。因此代码不能在Result中枚举,它们必须由使用Result类的类定义。

避免隐式转换

return true;

在客户端代码声明中,构造函数已经显式声明。但是在嵌套方法调用中,又会出现另一个问题。说,我有一个方法

bool doSomething()
{
return true;
}

我在返回 Result 对象的函数中使用它。我想转发嵌套调用的结果码

Result doSomethingElse
{
Result result = doSomething();
return result;
}

使用 Result 赋值运算符的当前实现,这不会给我编译器错误 - doSomething() 的 bool 返回值被隐式转换为 unsigned long。

正如我在 C++ 文档中所读到的,只有构造函数和转换运算符可以显式声明。

我的问题

  1. 为什么显式不允许赋值运算符或其他方法? IMO 允许任何方法也是显式的很有意义。
  2. 是否有其他解决方案来防止赋值运算符的隐式类型转换?

最佳答案

你的问题不在类里面Result : 毕竟,您显式创建它的一个新实例; explicit不能禁止。

我不认为你可以禁止隐式提升bool -> long .

您可以解决它。一种方法是制作 ResultCode 不是 是整数类型。然后, 可以有一个明确的构造函数。有点像

class ResultCode 
{
unsigned long m_code;
public:
explicit ResultCode(unsigned long code) : m_code(code) {}
operator unsigned long () { return m_code; }
};

将允许您使用 ResultCode任何你可以使用 unsigned int 的地方并将其创建为 ResultCode res = 5return ResultCode(5)但不调用期望 ResultCode 的函数(例如 Result 构造函数!)与任何不是 ResultCode 的东西已经,也不做类似 return 5 的事情如果函数必须返回 ReturnCode .

否则你可以使用模板重载来“捕获”任何不是 unsigned int 的东西并强制它是一个错误

typedef unsigned long ResultCode;

class Result
{
ResultCode m_par;

public:
template<typename T>
Result(T param) { static_assert(false); }

template<>
Result(ResultCode par): m_par(par) {}
};

int main()
{
ResultCode a = 5; //ok
//unsigned long a = 6; //also ok
//bool a = true; //error!
//int a = 7; //also error!!
Result b(a);
}

关于C++:我可以做一个赋值运算符 "explicit"吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38451653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com