【发布时间】:2010-10-29 18:52:24
【问题描述】:
编辑:
所以这个问题被误解到如此荒谬的程度,以至于它不再有意义。我不知道如何,因为我实际上问的问题是我的具体实现是否——是的,已知毫无意义,是的,与惯用的 C++ 不太相似——宏已经尽可能好,它是否必须使用 auto,或者是否有合适的解决方法。它不应该引起如此多的关注,当然也不会引起如此严重的误解。要求受访者编辑他们的答案是没有意义的,我不希望任何人因此而失去声誉,而且这里有一些很好的信息可供潜在的未来观众使用,所以我将任意选择一个投票率较低的人答案以平均分配所涉及的声誉。继续前进,这里没什么可看的。
我看到 this question 并决定用 C++ 编写 with 语句可能会很有趣。 auto 关键字使这非常容易,但有没有更好的方法来做到这一点,也许不使用 auto?为简洁起见,我省略了部分代码。
template<class T>
struct with_helper {
with_helper(T& v) : value(v), alive(true) {}
T* operator->() { return &value; }
T& operator*() { return value; }
T& value;
bool alive;
};
template<class T> struct with_helper<const T> { ... };
template<class T> with_helper<T> make_with_helper(T& value) { ... }
template<class T> with_helper<const T> make_with_helper(const T& value) { ... }
#define with(value) \
for (auto o = make_with_helper(value); o.alive; o.alive = false)
这是一个(更新的)使用示例,其中包含一个更典型的案例,显示了 with 在其他语言中的用法。
int main(int argc, char** argv) {
Object object;
with (object) {
o->member = 0;
o->method(1);
o->method(2);
o->method(3);
}
with (object.get_property("foo").perform_task(1, 2, 3).result()) {
std::cout
<< (*o)[0] << '\n'
<< (*o)[1] << '\n'
<< (*o)[2] << '\n';
}
return 0;
}
我选择了o,因为它是一个不常见的标识符,它的形式给人一种“通用事物”的印象。如果您有一个更好的标识符或更有用的语法的想法,那么请提出建议。
【问题讨论】:
-
谢谢...看起来很有趣也很有用。
-
@Robert Harvey:它基本上只是
{ [const] auto& o = ...; ... }的简写,但不那么难看。 -
您的意思是
#define with(value) \而不是#define with(value, id) \?顺便说一句,Boost.Typeof 怎么样? -
@KennyTM:是的,从测试中复制错误。谢谢你帮我抓住了。 Boost.Typeof 并不理想,因为它不能与用户定义类型开箱即用,这是
with最重要的用途之一。 -
@CiscolPPhone:完成了。 ;)
标签: c++ c++11 with-statement