- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的任务是迁移 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++ 文档中所读到的,只有构造函数和转换运算符可以显式声明。
我的问题
最佳答案
你的问题不在类里面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 = 5
或 return 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/
你能解释一下这个作业是如何完成的吗, var fe, f = document.forms[0], h; 哪个等于哪个。 最佳答案 以上等同于 var fe; var f = document.for
据我测试,这两种方法都有效,但我不知道哪一种最好,也不知道它们之间的区别,这就是我想知道的。 以下是两种方法: window.location = 'http://www.google.com'; w
我正在处理用字符串填充的 numpy 数组。我的目标是分配给第一个数组 a 的切片,值包含在较小尺寸的第二个数组 b 中。 我想到的实现如下: import numpy as np a = np.em
在我使用过的其他语言(如 Erlang 和 Python)中,如果我正在拆分字符串并且不关心其中一个字段,我可以使用下划线占位符。我在 Perl 中试过这个: (_,$id) = split('
我认为这似乎很简单,但我对调用、应用、绑定(bind)感到困惑。等等 我有一个事件监听器 red.addEventListener("click", function() { j = 0;
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 使用有什么区别: iFile =
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 使用有什么区别: iFile =
几周前我们开始写一篇关于 Haskell 的论文,刚刚接到我们的第一个任务。我知道 SO 不喜欢家庭作业问题,所以我不会问怎么做。相反,如果有人能将我推向正确的方向,我将不胜感激。鉴于它可能不是一个特
我正在尝试为我的函数的变量根分配一个值,但似乎不起作用。我不明白这个问题。 hw7.c:155:7:警告:赋值使指针来自整数而不进行强制转换[默认启用] root = 负载(&fp, 大小); 此代码
我昨天花了大约 5 个小时来完成这个工作,并使用这个网站的帮助让代码可以工作,但我认为我这样做的方式是一种作弊方式,我使用了 scanf 命令。无论如何,我想以正确的方式解决这个问题。多谢你们!哦,代
我需要一些帮助来解决问题。 我有这个文本文件: 我将文本内容输入到字符串二维数组中,并将其转换为整数二维数组。当我转换为 int 数组时,nan 被替换为零。现在,我继续查找二维数组中每行的最大值和最
假设我有一个只能移动的类型。我们停止现有的默认提供的构造函数,但 Rvalue 引用引入了一种新的“ flavor ”,我们可以将其用于签名的移动版本: class CantCopyMe { priv
假设我有两个简单的对象,我想创建第三个对象来连接它们的属性。这非常有效: (()=>{ const a1 = {a: 2, b: 3} const b1 = {a: 100, c: 5}
我想知道我是否可以稍后在这样的代码中为 VAR 赋值 var myView: UIView func createView() { myView = UIView() { let _view =
我遇到了一些 Javascript/HTML/CSS 代码的问题。我对创建网站还很陌生,所以请多多包涵。 我最终想做的是从 javascript 中提取一个动态值并使用它对一些 div(在容器中)进行
#include class Box{ public: int x; Box(){ x=0; std::cout No move construction thanks to RV
我发现在javascript中&=运算符是按位赋值: var test=true; test&=true; //here test is an int variable javascript中是否存在
请帮助完成赋值重载函数的执行。 这是指令: 赋值运算符 (=),它将源字符串复制到目标字符串中。请注意,目标的大小需要调整为与源相同。 加法 (+) 和赋值 (=) 运算符都需要能够进行级联运算。这意
我有一个名为 SortedArrayList 的自定义结构它根据比较器对其元素进行排序,我想防止使用 operator[] 进行分配. 示例: 数组列表.h template class Array
我是 python 的新手,我看到了这种为列表赋值的形式 color= ['red' if v == 0 else 'green' for v in y] 但是如果我尝试用 3 个数字来做,例如 co
我是一名优秀的程序员,十分优秀!