这是在C++中执行"with"语句的最佳方法吗?

Jon*_*rdy 4 c++ with-statement c++11

编辑:

所以这个问题被误解为这样一个荒谬的程度,它已经没有意义了.我不知道怎么回事,因为我实际过的问题是我是否具体实现了这个 - 是的,已知是无意义的,是的,不是非常类似于惯用的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)
Run Code Online (Sandbox Code Playgroud)

这是一个(更新的)用法示例,其中有一个更典型的案例,显示了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;

}
Run Code Online (Sandbox Code Playgroud)

我之所以选择o它是因为它是一个不常见的标识符,它的形式给人一种"通用的东西"的印象.如果你对一个更好的标识符或一个更实用的语法有了一个想法,那么请建议它.

dal*_*lle 7

如果你使用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';
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:没有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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*jan 6

?? 尝试将vb语法转换为C++

with在默认情况下引用我说过要做的对象,请执行以下块中的所有操作吗?执行一系列语句,重复引用单个对象或结构.

with(a)
 .do
 .domore
 .doitall
Run Code Online (Sandbox Code Playgroud)

那么该示例如何为您提供相同的语法?

向我举例说明为什么要使用多个de引用的地方

所以而不是

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
Run Code Online (Sandbox Code Playgroud)

你有

with( book.sheet.table.col(a).row(2) )
  .setColour
  .setFont
  .setText
  .setBorder
Run Code Online (Sandbox Code Playgroud)

看起来就像在C++中一样简单,也是更常见的语法

cell& c = book.sheet.table.col(a).row(2);
c.setColour
c.setFont
c.setText
c.setBorder
Run Code Online (Sandbox Code Playgroud)