代码之家  ›  专栏  ›  技术社区  ›  Jon Purdy

这是在C++中进行“带”语句的最好方法吗?

  •  4
  • Jon Purdy  · 技术社区  · 14 年前

    编辑:

    所以这个问题被误解到了一个荒谬的程度,以至于它不再有意义了。我不知道 怎样 因为我的问题 是否 我的具体实施 这个是的,已知是无意义的,是的,不是远类似于惯用的C++宏,它可能是好的,它是否必须使用。 auto 或者是否有合适的解决方法。它本不应该引起如此多的关注,当然也不会引起如此巨大的误解。要求被调查者编辑他们的答案是毫无意义的,我不想让任何人因为这件事而失去声誉,而且这里有一些很好的信息在为潜在的未来观众流动,所以我将任意选择一个投票率较低的答案来平均分配所涉及的声誉。往前走,这里什么也看不见。


    我看见了 this question 决定写一篇 with C++语句。这个 汽车 关键字使这非常容易,但是有没有更好的方法可以做到,也许不用 汽车 ?为了简洁起见,我省略了一些代码。

    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)
    

    下面是一个(更新的)使用示例,其中有一个更典型的示例,显示了 具有 在其他语言中也有。

    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 因为它是一个不常见的标识符,它的形式给人一种“一般事物”的印象。如果您有一个更好的标识符或者更有用的语法的想法,那么请建议使用它。

    4 回复  |  直到 14 年前
        1
  •  6
  •   Greg Domjan    14 年前

    with Executes a series of statements making repeated reference to a single object or structure.

    with(a)
     .do
     .domore
     .doitall
    

    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
    

    cell& c = book.sheet.table.col(a).row(2);
    c.setColour
    c.setFont
    c.setText
    c.setBorder
    
        2
  •  7
  •   dalle    14 年前

    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';
        }
    }
    

    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);
        }
    }
    
        3
  •  3
  •   Tim Cooper    9 年前

    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);
    
        }
    }
    
        4
  •  0
  •   Puppy    14 年前

    auto func = [&](std::vector<int>& o) {
    };
    func(vector_with_a_truly_ridiculously_long_identifier);