c++ - C++ 中的对象字面量替代方案

标签 c++ literals list-initialization value-initialization

我来自类似 Javascript 的语言,我可以在其中创建这样的函数。

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

其用法如下:

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

如果不清楚的话,这个函数会在 1 秒内将 mySprite 的 x 和 y 属性调整为 10,并以 1 秒的延迟循环 5 次。 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 示例完全匹配,我只是想知道它可以合理地简洁到什么程度。

最佳答案

当前版本的 C++ 不允许使用此语法。然而,根据此建议之一post被 C++20 采用,将通过使用指定的初始值设定项使其成为可能(如果,当然它会在那里实现)。

该提案已发布 here ,在 C++ 类中使用聚合初始化时借用 C99 提名成员语法。与统一初始化的 C++11 功能结合在一起,它将允许与您所要求的语法非常相似的语法。

例如,

struct args {
    int x;
    int y;
};

void foo(args a);
...
foo({.x = 10, .y = 25});

关于c++ - C++ 中的对象字面量替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45224382/

相关文章:

c++ - 函数重载时的 Typedef 编译错误

c++ - 如何从现有的 git cmake 项目创建 Xcode 项目?

c++ - 作为参数传递时字符串文字的存储类型

C++:考虑但不调用构造函数的特殊性

c++ - 复制初始化表单 '= {}'

c++ - Qt和opencv中的人脸检测

c++ - 为什么我不能在类中为静态变量设置值?

F# [<Literal>] 导致程序无效

java - Java中HashMap的字面声明

c++ - 是否有一种可扩展的方法可以从 C++ 中的数组初始化结构体?