Моделирование (насколько это возможно) анонимное объявление структуры + динамическая инициализацияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Моделирование (насколько это возможно) анонимное объявление структуры + динамическая инициализация

Сообщение Anonymous »

На некоторых языках мы можем объявить и инициализировать анонимную структуру - или эквивалент ее - плавно. Пример из Ecmascript: < /p>

Код: Выделить всё

function foo_in_ecmascript(x) {
let computed = {
bar  : magic(x),
baz  : mystery(x),
quux : fantasy(x)
};
// ... do stuff with computed.baz, computed.quux and/or
// computed.baz, e.g.
console.log(`computed.quux is ${computed.quux}`);
}
< /code>
Но мы не можем сделать это в C ++: < /p>
void foo(int x) {
struct {
auto bar  = magic(x);
auto baz  = mystery(x);
auto quux = fantasy(x);
} computed;

// ... do stuff with computed.baz, computed.quux and/or computed.baz
}
< /code>
... потому что мы не можем использовать инициализаторы поля неконтекса. Мы можем написать: < /p>
void foo2(int x) {
struct {
Bar bar;
Baz baz;
Quux quux;
} computed = {
magic(x),
mystery(x),
fantasy(x)
};
// ... do stuff with computed.baz, computed.quux and/or computed.baz
}
< /code>
Но это длиннее, требует изложения типа возврата каждой из функций, требует немного большей осторожности для поддержания соответствия строк и немного менее читаемо, поскольку тип и имя переменной отделены от инициализатора (и мы можем иметь еще больше полей). < /p>
с C ++, мы можем использовать проектные инициализации). class = "lang-c ++ prettyprint-override">void foo3(int x) {
struct {
Bar bar;
Baz baz;
Quux quux;
} computed = {
.bar  { magic(x)   },
.baz  { mystery(x) },
.quux { fantasy(x) }
};
// ... do stuff with computed.baz, computed.quux and/or computed.baz
}
< /code>
Что улучшает читабельность, но не длины в строках, и дублировать идентификаторы поля. < /p>
Но - мы можем сделать лучше, чем это? Приходите ближе к «интуитивно понятной», но недостижимой форме анонимного типа-декорация-инициализация? Это не может быть 3-ople, ни три отдельные переменные. Решение именно этой ситуации уже полезна, но в более общем плане функции могут принимать локальные переменные в foo () 
, другой параметр для foo () , глобальные исчисления и т. д.


Подробнее здесь: https://stackoverflow.com/questions/797 ... -initializ
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»