编辑:
所以这个问题被误解到如此荒谬的程度,以至于它不再有意义。我不知道怎么做,因为我实际问的问题是我对此的具体实现——是的,众所周知是没有意义的,是的,与惯用的 C++ 不太相似——宏是否尽可能好,以及它是否一定不得不使用auto
,或者如果有合适的解决方法。它不应该引起如此多的关注,当然也不会引起如此严重的误解。要求受访者编辑他们的答案是没有意义的,我不希望任何人因此而失去声誉,而且这里有一些很好的信息可供潜在的未来观众使用,所以我将任意选择一个投票率较低的人答案以平均分配所涉及的声誉。继续前进,这里没什么可看的。
我看到了这个问题,并决定with
用 C++ 编写一个语句可能会很有趣。关键字使这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
它是因为它是一个不常见的标识符,它的形式给人一种“通用事物”的印象。如果您有一个更好的标识符或更有用的语法的想法,那么请提出建议。