2017-01-12 21 views
0

私はEntity Component Systemライブラリで学習目的で作業しています。私はデザインに大きな変更を加えようとしています。Q:同じ配列内に異なる型のstd :: function

私はclass Systemを1つでupdateに分割して、いくつかのupdate関数を呼び出します。しかし、これらの機能は何でもかまいません。だから私は多くの異なるstd::functionタイプで終わった。

性能上の理由から、私は実際にtupleを使用したくありません(または、それは本当に効率的です、私に教えてください)。 std::arrayを使用したいのですが、どのようにすべての種類のstd::functionを一緒に入れることができますか?実際にはstructにはstd::functionが含まれていますが、そのためにstructに同じタイプの問題が発生します。

配列がコンパイル時に生成できる場合は、(引数なし)が最適です。

どのように動作させたいかを示すイラスト(実際のコードではありません)があります。とにかく

//Function to add a function in the list [[Call by User]] 
addSystemBloc<Position, Speed>(function(ArgIDontKnow, Position, Speed), otherThings); 

//Function to generate a structure (probably a graph) linked to the array 
generateGraph(); 

//Inside the initialization of the System using the function we just add [[ Call by User ]] 
addArgument(id, arg); //id is not really nice, and this guy know the function he wants to add an arg (with std::bind) 

//Somwhere in the main loop [[ Call by Library ]] 
invoke(func, Position, Speed); 

おかげ

+1

異なるタイプの配列が必要ですか?できません。配列のすべての要素は同じです。どのようなパフォーマンス上の問題がタプルについて心配していますか?タプルはオーバーヘッドがありません。 –

+0

どのようにこれらの関数の型を発見して呼び出すことができますか? (それぞれの位置が固定タイプの場合はそれがタプルです) – molbdnilo

+0

おそらく[Boost variant](http://www.boost.org/doc/libs/1_63_0/doc/html/variant.html)または[Boost any] (http://www.boost.org/doc/libs/1_63_0/doc/html/any.html)(あるいは今後登場する標準ライブラリの変種['std :: variant'](http://en.cppreference。 com/w/cpp/utility/variant)と['std :: any'](http://en.cppreference.com/w/cpp/utility/any)を参照してください)。しかし、私は本当にそれらをお勧めします、代わりに私はむしろ(まだあなたはそれに取り組んでいる)あなたのデザインを再考しようとすることをお勧めしたいと思います。 –

答えて

2

アレイは、指定されたタイプの値の固定長配列です。 タプルは、指定された型の固定長の値のシーケンスです。 メソッドを持たない構造体は、指定された型の値の固定長シーケンスです。

これらはすべて、要素の検索(定数)、移動/コピー(sizeof(Thing)バイト)と同じ性能特性を持ちます。

想像している「パフォーマンス上の問題」は何ですか?

参照:http://en.cppreference.com/w/cpp/language/object

+0

タプルよりも連続メモリでもあり、配列のようなキャッシュの問題はありませんか? –

+0

はい、オブジェクトのレイアウトのルール – Caleth

+0

ああ、私はその感謝については確信できませんでした:)タプルは非常に強力なので、私は彼らの意見を見る必要があります。オブジェクトレイアウトのルールを説明するリンクがある場合、私はあなたの答えでこれを閉じます。 –

関連する問題