- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近看到这样的代码:
// 3rd Party API: (paraphrased)
void APIResetIterator(int ID); // reset iterator for call to next()
Mogrifier* APINext(int ID); // User must delete pointer returned
...
typedef std::unique_ptr<Mogrifier> MogPtr;
...
const it listID = 42;
APIResetIterator(listID);
MogPtr elem;
while (elem.reset(APINext(listID)), elem) {
// use elem
}
这是个好主意吗?有用吗?
为了方便引用,我会加上相应的for循环:
for (MogPtr elem(APINext(listID)); elem; elem.reset(APINext(listID));) {
// use elem
}
... 也不是真正的最佳选择...
最佳答案
正如其他答案中所说:这在技术上是可以的,并且可以按预期工作。但是你质疑它实际上表明它不是一个好主意,因为它缺乏可读性。
这是一种伪装的 for 循环,类似于这个:
int i = -1;
while (++i, i<10) { something(i); }
换句话说,您可以通过实际使用 for 循环使其更清晰:
for (MogPtr elem{APINext(listID)}; elem != nullptr; elem.reset(APINext(listID)))
{
// use elem
}
唯一的问题是您必须键入 APINext
两次(震惊!)这可能是有人按现在的方式编写它的原因。
经验教训:可读性胜过懒惰。
编辑:在我看来,键入 APINext(listID)
两次实际上是一件好事,因为它清楚表明第一次实际上是初始化,其他时候,这是重新分配。
Edit2: Iterator/Next()
组合在 C++ 中可能看起来有点不寻常,因为 C++ 标准库迭代器使用运算符重载。在 Java 和其他没有运算符重载的语言中,这是正常的处理方式。如果需要,您可以编写一个简单的 C++ 样式的前向迭代器来包装 API 调用:
class MogrifierIterator {
MogPtr ptr_;
int listID_
public:
MogrifierIterator() : ptr_(nullptr) {} //end-Iterator
explicit MogrifierIterator(int listID) : ptr(nullptr), listID_(listID) {
APIResetIterator(listID_);
ptr_.reset(APINext(listID_));
}
Mogrifier& operator*() { return *ptr_; }
Mogrifier* operator->() { return ptr_.get(); }
MogrifierIterator& operator++() { ptr_.reset(APINext(listID_)); return *this; }
bool operator==(MogrifierIterator const& other)
{ return (ptr_==other.ptr_) && (ptr_ == nullptr || listID_ == other.listID_); }
};
//...
for (MogrifierIterator it(listID); it != Mogrifieriterator(); ++it)
{
it->mogrify();
}
它不完整,我还没有测试它,它可能包含错误,但你明白了要点:)
关于c++ - while 循环中的智能指针测试 : use the comma operator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15022085/
编辑:在我的示例中,=> 表示“评估为”,而 -> 表示“扩展到 macroexpand-1” . 我正在努力研究 Common Lisp 中的嵌套反引号,我想我已经非常接近理解它了,多亏了其他几个
我正在创建一个必须按以下方式格式化的请求字符串: http://staging.myproject.com?tags=tag1,tag2,tag3 在用户编写标签的窗体上有一个 EditText 对话
我的文字如下: "text","1","more, more text","3" 任何人都可以告诉我我必须使用什么正则表达式分隔符才能获得以下内容: text 1 more, more text 3
我有一个像下面这样的字符串 - value1, value2, value3, value4, "value5, 1234", value6, value7, "value8", value9, "v
我有一个用户表,其中包含一列(例如兴趣),以逗号分隔的兴趣 ID 作为值。例如 user interests A 12,13,15 B 10,11,12,15 C 9,13
我有一个用户表,其中包含一列(比如兴趣),其中以逗号分隔的兴趣 ID 作为值。例如 user interests A 12,13,15 B 10,11,12,15 C 9,1
因此,我有一个值为“app、beta、theta”的单元格,我想查看填充有上述单元格的列是否包含我的单元格值。例如:AA 列有这些单元格:“app”; “theta,应用程序”; “theta,app
以这个小示例代码为例: struct Test{ operator int() const{ return 0; } }; Test test(){ retur
我需要一个代码来计算 Richtextbox 行中有多少个逗号。如果有 4 个或更多逗号,则执行某些操作,否则删除行。 最佳答案 这是强制性的 LINQ 答案: Dim cnt As Integer
我正在查看字符串是否有逗号。 假设我有两个用户名“David, Boon”和“David Blind”。 我需要根据用户名中是否存在“,”的条件编写一个 if 循环。有没有办法检查? .Net 中的包
我正在使用FCSA Number处理 AngularJS 中的小数输入。 如果我使用 maxDecimals 选项,它几乎可以按预期工作。对于两位小数,“100.333”等输入将转换为“100.33”
我现在如何在 Elixir 中获得低于字符串的结果。 ['x1', 'x2'] 我尝试使用 enum.join 但没有获得所需的数据 到 'x1,x2' 最佳答案 如果我理解正确,你应该使用Enum.
我现在如何在 Elixir 中获得低于字符串的结果。 ['x1', 'x2'] 我尝试使用 enum.join 但没有获得所需的数据 到 'x1,x2' 最佳答案 如果我理解正确,你应该使用Enum.
我有用逗号分隔的字符串。 首先,我想检查是否包含逗号的字符串。 在我的应用程序中,字符串如下所示: NSString *str=@"1,2,3"; 如何检查它是否包含逗号? 最佳答案 我使用以下
我正在尝试解决逗号代码项目以自动执行无聊的事情。我在第一个 if 语句方面遇到了麻烦。我正在尝试输出字符串:“苹果、香蕉、 bean 腐和猫”。由于某种原因,它跳过了列表中的第一项。 编辑:本教程没有
我正在尝试创建一个 onkeydown() 函数,强制文本输入字段中逗号 (",") 后的所有字母大写。 我知道我可以使用这个函数将所有字母变为大写: function makeUppercase(f
我有以下代码。 $(document).ready(function(){ $('input[type="checkbox"]').click(function(){ elem =
使用 JavaScript,什么是将点替换为逗号的正确方法(对于欧盟货币),例如: 2000.65 将是 2000,65 而不是 2,000.65 39.20 将是 39,20 我不确定 cost.r
打印中的,加了一个空格 >>> print "a","b" a b 如果我需要一个\t,我放 >>> print "a","\t","b" a b 如何将 , 的输出更改为 \t? 最佳答
我需要检查某些文本是否仅包含小写字母 a-z 和逗号 (",")。 在 Python 中执行此操作的最佳方法是什么? 最佳答案 import re def matches(s): return
我是一名优秀的程序员,十分优秀!