Изменить:
Таким образом, этот вопрос был неправильно истолкован до такой смехотворной степени, что он больше не имеет смысла. Я не знаю, как, поскольку вопрос, который я на самом деле задал, заключался в том, моя конкретная реализация этого да, известная как бессмысленная, да, не напоминающий идиоматический макрос C++, был настолько хорош, насколько мог быть, и обязательно ли он должен был использовать auto
, или вместо этого существовало подходящее обходное решение. Это не должно было вызвать такого большого внимания и уж точно не такого масштаба непонимания. Бессмысленно просить респондентов редактировать свои ответы, я не хочу, чтобы кто-то терял репутацию из-за этого, и здесь есть некоторая полезная информация для потенциальных будущих зрителей, поэтому я собираюсь произвольно выбрать один из тех, кто получил меньше голосов. ответы для равномерного распределения вовлеченной репутации. Проходи мимо, здесь не на что смотреть.
Я увидел этот вопрос и решил, что было бы интересно написать оператор with
в С++. Ключевое слово 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
, потому что это необычный идентификатор, а его форма производит впечатление "обычной вещи". Если у вас есть идея для лучшего идентификатора или более удобного синтаксиса в целом, пожалуйста, предложите это.
{ [const] auto& o = ...; ... }
, но немного менее уродливое. - person Jon Purdy   schedule 29.10.2010#define with(value) \
вместо#define with(value, id) \
? Кстати, как насчет Boost.Typeof? - person kennytm   schedule 29.10.2010with
. - person Jon Purdy   schedule 29.10.2010with
утверждения, когда они у них есть. Я никогда не говорил, что считаю его особенно полезным как таковым. Это всего лишь мимолетная мысль, но я должен задаться вопросом, есть ли возможности для улучшения. - person Jon Purdy   schedule 29.10.2010auto
? - person Jon Purdy   schedule 30.10.2010