2017-07-20 9 views
0

私はこのような関数を作成できる言語のようなJavascriptから来ています。C++でのオブジェクトリテラル代替

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

これは同様に使用されている:それは明確ではない場合、これは1秒の遅延で5回ループし、1秒にわたって10にmySpriteがのxおよびyプロパティをlerps

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

。 tweenParamsにはobjが持つ可能性のある値を含めることができ、tweenOptionsは固定構造体です。

これはC++でどのように簡潔であるかを知りたいのですが、構造体と配列の初期化はこれを表現するのに十分柔軟ではないようです。私の最高の推測では、複数のトゥイーン関数を一度に1つのプロパティと呼び出す必要があります。

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

C++の高度な機能についてよくわかりませんが、演算子のオーバーロードやカスタムの初期化が私を助けてくれますか?

EDIT:明確にするために、私はJavascriptの例と正確に一致するとは思っていませんが、これは合理的にどのように簡潔であるかを知りたいだけです。

+3

は残念ながら、C++は、現在、このきれいな何かを持っていません。 C++ 20は*指定された初期化子*を追加します。現時点では、Builderパターンを解決する必要があります。 – Justin

+2

あなたは 'tween(mySprite、{x:10、y:10}、1、{startDelay:1、loops:5}); 'を書くことはできませんが、' tween {10,10}、1、{1,5}); '。あなたは[良いC + +の本](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – NathanOliver

+3

C + +はJavaScriptではない方法を学ぶことができます。あなたのJavaScriptコードに表示されているテクニックは賛成ではなく、エラーが起こりやすいです。誰かが誤字があった場合にどうなるか考えてみてください。あなたはC++スタイルを書いているときに「解決」しなければなりません。 –

答えて

1

現在のバージョンのC++では、この構文が許可されていません。しかし、このpostによれば、C++ 20に採用された提案の1つは、指定されたイニシャライザを使用することで可能になります(もちろんそれをそこに作ろうとすれば)。

提案は、hereで利用可能であり、C++クラスで集約初期化を使用するときに、指名メンバーのC99構文を借用します。一様な初期化のC++ 11の機能と組み合わせれば、あなたが求めるものと非常によく似た構文が可能になります。例えば

struct args { 
    int x; 
    int y; 
}; 

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

指定された初期化子は、私がC++ 20で楽しみにしていることの1つです。このようなことをすることができ、関数への奇妙な名前付き引数の必要性がなくなります。名前付き引数を指定された初期化子を介して使用される構造体の一部にすることができます。 – Justin

+0

@ジャスティン、ここに引数はありません。私はそれが有用な機能だとも思っています。私はそれを見たいと思っています。私の見解では、エラーの可能性を大幅に低減します。 – SergeyA

関連する問題