Это лучший способ сделать «с» утверждением в C ++?

StackOverflow https://stackoverflow.com/questions/4054946

  •  27-09-2019
  •  | 
  •  

Вопрос

Редактировать:

Таким образом, этот вопрос был неверно истолкован по такой невероженой степени, что у него больше нет смысла. Я не знаю как, так как вопрос, который я на самом деле спросил был ли Моя конкретная реализация Из этого - да, известно, как бессмысленно, да, не удаленно напоминающий идиоматический 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)

Вот пример использования (обновленного) использования с более типичным случаем, который показывает использование 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

Так как пример дает вам тот же синтаксис?

Для меня примеры того, почему использовать с туда, где множественная девессы

так скорее, чем

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);

    }
}

Почему бы не просто использовать хорошую лямбда?

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

Простой факт заключается в том, что если ваши идентификаторы настолько длинные, что вы не можете вводить их каждый раз, используйте ссылку, функцию, указатель и т. Д. Для решения этой проблемы или лучше, рефакторируют имя. Такие заявления такие (например, использование () в C #) имеют дополнительные побочные эффекты (в моем примере детерминированной очистки). Ваше заявление в C ++ не имеет несущих фактических преимуществ, поскольку на самом деле не вызывает любое дополнительное поведение против просто написания кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top