問題タブ [heterogeneous]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - アドホック ポリモーフィズムと、値セマンティクスを使用した異種コンテナー
オーバーロードされた無料の関数 (アドホック ポリモーフィズム) を介して同じ操作をすべてサポートする、関連のない型がいくつかあります。
use()
質問のタイトルが示すように、これらの型のインスタンスを異種コンテナに格納して、具体的な型に関係なくそれらを格納したいと考えています。コンテナーには値のセマンティクスが必要です (つまり、2 つのコンテナー間の割り当てはデータをコピーし、共有しません)。
もちろん、これは完全に拡張可能でなければなりません。を受け取るライブラリ API と、vector<???>
既知の型に独自の型を追加するクライアント コードを考えてみてください。
通常の解決策は、(スマート) ポインターを (抽象) インターフェース (例: ) に格納することですvector<unique_ptr<IUsable>>
が、これには多くの欠点があります-私の頭の上から:
- 現在のアドホック ポリモーフィック モデルを、すべてのクラスが共通インターフェイスから継承するクラス階層に移行する必要があります。ああスナップ!
int
ここで、andのラッパーを作成する必要がstring
あります。自由なメンバー関数がインターフェイス (仮想メンバー関数) と密接に結び付いているため、再利用性/構成可能性が低下することは言うまでもありません。 - コンテナーはその値のセマンティクスを失います:
vec1 = vec2
使用すると単純な代入が不可能になりunique_ptr
(ディープ コピーを手動で実行する必要があります)、使用すると両方のコンテナーが共有状態になりますshared_ptr
(これには長所と短所がありますが、値が必要なのでコンテナのセマンティクス、ここでもディープ コピーを手動で実行する必要があります)。 - ディープ コピーを実行できるようにするには、すべての派生クラスに実装する必要がある仮想
clone()
関数をインターフェイスがサポートする必要があります。それよりももっとつまらないことを真剣に考えられますか?
要約すると、これにより多くの不必要な結合が追加され、大量の (おそらく役に立たない) ボイラープレート コードが必要になります。これは間違いなく満足のいくものではありませんが、これまでのところ、これが私が知っている唯一の実用的な解決策です。
私は長い間、サブタイプのポリモーフィズム (別名、インターフェース継承) に代わる実行可能な方法を探してきました。私はアドホック ポリモーフィズム (別名、オーバーロードされた無料関数) でよく遊んでいますが、常に同じハードウォールにぶつかっています: コンテナーは同種でなければならないため、私は常にしぶしぶ継承とスマート ポインターに戻りますが、既に上に挙げたすべての欠点があります (そしておそらくそれ以上)。
理想的には、現在の (存在しない) 型階層に何も変更せずvector<IUsable>
に、適切な値のセマンティクスを使用して、サブタイプのポリモーフィズムを要求する代わりにアドホックなポリモーフィズムを維持したいと考えています。
これは可能ですか?もしそうなら、どのように?
mysql - mysql_fdw またはを使用して Postgres から MySQL にテーブルを結合する
MySQL に反映する必要がある Postgres のテーブルがあります。このhttp://wiki.postgresql.org/wiki/Foreign_data_wrapper#mysql_fdwを見つけましたが、実際に MySQL にリンクする方法は非常に不明確です。CREATE FOREIGN TABLE は Postgres では機能しますが、MySQL では構文エラーです。すべての CREATE FOREIGN TABLE を実行し、Postgres で CREATE SERVER mysql_svr を作成した後、MySQL に魔法のようにデータが表示されないため、ステップが欠落している必要があります。
list - Scala の異種リスト; マップ機能を使う
したがって、問題は shapeless ライブラリhttps://github.com/milessabin/shapelessの HLists を理解することにあります。私はHLists
いくつかの関数を保存するために使用しています:
そして、それは完璧に機能します。リストから任意の関数を取得して適用できます。
list.head(object)
しかし、map
関数(list map mapFunc
)で適用するのに問題があります:
それは言いApplication doesnt take parameters
ます。では、どうすれば対処できますか?Mb私はsmthを理解していませんか?私はScalaが初めてです。
psコンストラクターには興味深い効果があります。このコードは少し間違っています:
function1(_) :: function2(_) :: HNil
何らかのタイプの関数として認識されますHList(function1(_), function2(_))
が、正しいタイプを持っています。
編集
'ps' が決定されました -function1(_) :: function2(_) :: HNil
本当に型の不一致があります。function1 _ :: function2 _ :: HNil
でも大丈夫です!
list - 動的に成長する異種リスト、Scala
永続化する方法はありますか (つまり、変数に保持することを意味します) (可能ですか?) 動的に成長しHList
ますか? 私の疑似コード:
明らかに、このコードは機能しません。それはうまくいきますが、タイプミスlist.head
の理由でさえできませんHList
(私が認識しているようにlist
、タイプパラメータをまったく保持していません)。
結果のタイプ:
だから、それは間違っています。
編集
上記の情報だけでは不十分です。
HList
だから私は、任意の型にすることができる変数のようなものをいくつかのオブジェクトに入れたいと思っていました。
HList
この変数を時々渡すため。
ps @milessabin mbは、私の問題に対する別の解決策を見つける方が良いということです。
scala - 変更可能な異種リスト、Scala
異種のリストである必要がある可変オブジェクトに要素を追加することは可能ですか?
つまり、私はダイクストラのアルゴリズムを扱っており、そのような方法でグラフの弧にいくつかの関数を保持する必要があります:
start
- は開始ノードです。end
- 終了ノード; f
- はノード間の何らかの機能であり、アークはこの機能を維持するためのオブジェクトであり、私にとって最も重要なことです。
すべて完璧ですが、ノード内のリストにすべてのアークを保持します。
おわかりのように、問題は、単純なリストでは型が失われることです。ノードに新しいアークを追加すると、タイプに関するすべての情報が失われます。
問題を解決する可能な方法は、次を使用することHLists
です。いくつかの作業コードの例(説明にさらに情報を追加するため):
ちなみに、今はすべてそのような方法です:
問題は、以下のコードのように (正しくない -- タイプ エラー)、この HList に要素を追加するにはどうすればよいかということです。
このタイプの不一致を渡す方法さえわからなかったので、すべての遷移をノードのフィールドとして保持し、すべてのタイプを保持する方法がわかりません。
編集
うーん、トランジションをコンストラクターに渡すことができ、可変オブジェクトをまったく使用しません。
c# - C#のArrayListは異種データを保存できますか
次のような1つの配列リストに整数、文字列、およびユーザー定義のクラスオブジェクトを格納することは可能ですか?
可能な場合は、格納されている要素にアクセスする方法(キャストする方法)? そうでない場合、これを実装する方法はありますか?