Is this the best way to do a "with" statement in C++?
Edit:
 So this question was misinterpreted to such a ludicrous degree that it has no point anymore.  I don't know how, since the question that I actually asked was whether my specific implementation of this—yes, known to be pointless, yes, not remotely resembling idiomatic C++—macro was as good as it could be, and whether it necessarily had to use auto , or if there was a suitable workaround instead.  It was not supposed to generate this much attention, and certainly not a misunderstanding of this magnitude.  It's pointless to ask respondents to edit their answers, I don't want anybody to lose reputation over this, and there's some good information floating around in here for potential future viewers, so I'm going to arbitrarily pick one of the lower-voted answers to evenly distribute the reputation involved.  Move along, nothing to see here.  
 I saw this question and decided it might be fun to write a with statement in C++.  The auto keyword makes this really easy, but is there a better way to do it, perhaps without using auto ?  I've elided certain bits of the code for brevity.  
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)
 Here's an (updated) usage example with a more typical case that shows the use of with as it is found in other languages.  
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;
}
 I chose o because it's an uncommon identifier, and its form gives the impression of a "generic thing".  If you've got an idea for a better identifier or a more usable syntax altogether, then please do suggest it.  
?? attempted vb syntax into C++
 with says do all the things in the following block by default referencing the object I've said to do it with right?  Executes a series of statements making repeated reference to a single object or structure.  
with(a)
 .do
 .domore
 .doitall
so how is the example giving you the same syntax?
to me examples of why to use a with where multiple de referencess
so rather than
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
you have
with( book.sheet.table.col(a).row(2) )
  .setColour
  .setFont
  .setText
  .setBorder
seems just as easy, and more common syntax in C++ to
cell& c = book.sheet.table.col(a).row(2);
c.setColour
c.setFont
c.setText
c.setBorder
 If you use auto , why use macros at all?  
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';
    }
}
 EDIT: Without auto , just use typedef and references.  
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);
    }
}
