Это лучший способ сделать «с» утверждением в C ++?
-
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 ++ не имеет несущих фактических преимуществ, поскольку на самом деле не вызывает любое дополнительное поведение против просто написания кода.