Объектная буквальная альтернатива в C++

Я исхожу из языка, похожего на Javascript, где я могу создавать такие функции.

function tween(obj, tweenParams, time, tweenOptions);

Это используется как:

tween(mySprite, {x: 10, y: 10}, 1, {startDelay: 1, loops: 5});

Если неясно, это приводит к тому, что свойство x и y mySprite увеличивается до 10 в течение 1 секунды, зацикливаясь 5 раз с задержкой в ​​1 секунду. tweenParams может содержать любые значения, которые может иметь объект obj, а tweenOptions - это фиксированная структура.

Я хочу знать, насколько кратко это может быть разумно в C++, инициализация структуры и массива не кажется достаточно гибкой, чтобы выразить это. Мое лучшее предположение заключается в вызове нескольких функций анимации по одному свойству за раз, что-то вроде.

TweenOptions opts = {};
opts.startDelay = 1;
opts.loops = 5;
tween(&mySprite.x, 10, 1, opts);
tween(&mySprite.y, 10, 1, opts);

Я не знаю много о расширенных возможностях C++, может быть, перегрузка операторов или пользовательские инициализации могут помочь мне здесь?

РЕДАКТИРОВАТЬ: Чтобы быть ясно, я не ожидаю, что он точно соответствует примеру Javascript, я просто хочу знать, насколько это может быть кратким.

1 ответ

Текущие версии C++ не допускают этот синтаксис. Однако одно из предложений, которое согласно этому посту было принято для C++20, сделает это возможным с помощью назначенных инициализаторов (если, конечно, он это сделает).

Предложение, доступное здесь, заимствует синтаксис C99 для назначения членов при использовании агрегатной инициализации в классах C++. В сочетании с функцией унифицированной инициализации C++11 он позволяет использовать синтаксис, очень похожий на тот, который вы запрашиваете.

Например,

struct args {
    int x;
    int y;
};

void foo(args a);
...
foo({.x = 10, .y = 25});
Другие вопросы по тегам