Объектная буквальная альтернатива в 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});