这是在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)?