Изменить:
Так что этот вопрос был неверно истолкован до такой нелепости, что больше не имеет смысла. Я не знаю, как , поскольку вопрос, который я на самом деле задал , был: моя конкретная реализация этого - да, известно, что это бессмысленно, да, нет отдаленно напоминающий идиоматический макрос C ++ & mdash; был настолько хорош, насколько это возможно, и должен ли он обязательно использовать 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
, потому что это необычный идентификатор, а его форма создает впечатление "универсальной вещи". Если у вас есть идея для лучшего идентификатора или более удобного синтаксиса, тогда, пожалуйста, предложите его.