这是在C ++中使用“with”语句的最佳方式吗?
编辑:
所以这个问题被误解为这样一个荒谬的程度,它已经没有意义了。 我不知道这是怎么回事,因为我实际上问的问题是,我的这个具体实现 - 是的,是否已知是毫无意义的,是的,并非与惯用的C ++宏非常类似,它是否可以是好的,以及它是否一定必须使用auto
,或者如果有适当的解决方法。 它不应该引起这么多的关注,当然不是对这种重要性的误解。 要求受访者编辑他们的答案是毫无意义的,我不希望任何人失去这方面的声誉,并且这里有一些很好的信息可供未来的潜在观众使用,所以我将任意选择一个较低的投票权答案均匀分配涉及的声誉。 移动,没有什么可以在这里看到。
我看到了这个问题,并决定with
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
是因为它是一个不常见的标识符,它的形式给人一种“通用事物”的印象。 如果你有一个更好的标识符或一个更有用的语法的想法,那么请建议。
?? 尝试vb语法到C ++中
with
说在默认情况下引用下面的块中的所有东西,我说过用正确的方式做对象? 执行一系列重复引用单个对象或结构的语句。
with(a)
.do
.domore
.doitall
那么这个例子如何给你相同的语法?
对我来说,为什么要使用与多个de referencess的例子
所以而不是
book.sheet.table.col(a).row(2).setColour
book.sheet.table.col(a).row(2).setFont
book.sheet.table.col(a).row(2).setText
book.sheet.table.col(a).row(2).setBorder
你有
with( book.sheet.table.col(a).row(2) )
.setColour
.setFont
.setText
.setBorder
看起来就像C ++中的一样简单和更常见的语法
cell& c = book.sheet.table.col(a).row(2);
c.setColour
c.setFont
c.setText
c.setBorder
如果你使用auto
,为什么要使用宏呢?
int main()
{
std::vector<int> vector_with_uncommonly_long_identifier;
{
auto& o = vector_with_uncommonly_long_identifier;
o.push_back(1);
o.push_back(2);
o.push_back(3);
}
const std::vector<int> constant_duplicate_of_vector_with_uncommonly_long_identifier
(vector_with_uncommonly_long_identifier);
{
const auto& o = constant_duplicate_of_vector_with_uncommonly_long_identifier;
std::cout
<< o[0] << 'n'
<< o[1] << 'n'
<< o[2] << 'n';
}
{
auto o = constant_duplicate_of_vector_with_uncommonly_long_identifier.size();
std::cout << o <<'n';
}
}
编辑:没有auto
,只需使用typedef
和引用。
int main()
{
typedef std::vector<int> Vec;
Vec vector_with_uncommonly_long_identifier;
{
Vec& o = vector_with_uncommonly_long_identifier;
o.push_back(1);
o.push_back(2);
o.push_back(3);
}
}
对于C ++ 0x(你正在假设):
int main() {
std::vector<int> vector_with_uncommonly_long_identifier;
{
auto& o = vector_with_uncommonly_long_identifier;
o.push_back(1);
o.push_back(2);
o.push_back(3);
}
}
链接地址: http://www.djcxy.com/p/51687.html
上一篇: Is this the best way to do a "with" statement in C++?
下一篇: What are the rules for JavaScript's automatic semicolon insertion (ASI)?