問題タブ [generic-programming]
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++ - コンテナーへの反復子を使用して、「ダム」関数を汎用 STL スタイルにリファクタリングする
C++ のいくつかの機能 (for_each、マッピング関数、反復子の使用など) について頭を悩ませることはできましたが、汎用コンテナーと反復子を取り込むためのテンプレートと関数引数リストの構築は、まだわかりません。私は誰かが私のために説明できることを望んでいる実用的な例を持っています:
着信 std::vector を処理し、プロセスの多くのデータポイント/反復の実行中の合計を構築する次の関数を使用します。
上記は機能しますが、イテレータを取り、この合計を実行する関数が必要です。さらに良いことに、コンテナーの型を指定する代わりに、推測される型を含むジェネリック パラメーター リストを用意します。つまり、次のようになります。
この時点で私は本当に迷っており、テンプレートと引数リストを定義して関数を汎用にする方法を見つけるための少しのガイダンスが必要です。テンプレートと関数の定義はどのようになりますか? 私は、STL 機能を使用してこの特定のタスクを実行する方法に既に精通しています。一般的な関数/テンプレート定義の図を探しています。
scala - データ型-Scala用のジェネリックプログラミングライブラリ
データ型ジェネリックプログラミング(たとえば、Scrap Your Boilerplateなど)を可能にするScalaライブラリを探しています。適切なリンクとそれぞれの簡単な説明を含むライブラリのリストは、完璧な答えです。
c# - ジェネリック型引数を持つ型の C# 拡張メソッド
私が取り組んでいるアプリケーションの一部のコードの一貫性、簡潔さ、および読みやすさを改善する方法を検討しています。開始コードは次のようになります。
上記のようなほぼ同一のコード行がいくつかあります。私はそれを次のように書き直したかった:
一つには、これにより、すでに非公式な慣習となっているものを公式化する利点を活かすことができます。また、「コンテキストがバーの種類を取得し、fizz をサブスクライブしてから何かを実行する」ではなく、「バーが指定されたコンテキストで fizz イベントをサブスクライブする」のようなものになることを期待しました。流れが良くなったと思いますし、聞いた同僚も同意してくれました。
これを拡張メソッドとして実装し始めました。上記を達成するために、イベント型の抽象ジェネリック基本クラスを利用したかったのでFizz
、Event<T>
. これは、拡張メソッドへのジェネリック型引数が、拡張メソッドが呼び出される型になるように制約する必要があることを意味します。したがって、上記の例でFizz
は、 は type である必要がありEvent<Bar>
ます。
これは可能ですか?それまでの間、別の解決策を採用しましたが、それが達成できるかどうかはまだ興味があります. 他の提案も大歓迎です。
ありがとう!
編集#1:明確にするために、追加の型パラメーターを使用できることを認識していますが、可能であればそれを回避する方法を探しています。
編集#2:私のシナリオと100%一致しないため、受け入れられた回答をわずかに変更すると思います。要するに、目的を達成するために、Type の拡張メソッドの代わりに汎用静的クラスを使用できるということです。ありがとうdss539!
コードを更新します (オンザフライで行っているため、タイプミスがある可能性があります):
c++ - 過剰な一般化とは何だと思いますか?
Haskell やその他の関数型言語をいじってみると、一般的な用語で問題を記述することによる設計の単純さに感謝するようになりました。テンプレート プログラミングの多くの側面は決して単純ではありませんが、一部の使用法は十分に一般的であるため、明確化の妨げにはならないと思います (特に関数テンプレート)。テンプレートを使用すると、現在のデザインを単純化しながら、将来への抵抗を自動的に追加できることがよくあります。それらの機能をライブラリの作成者に委ねる必要があるのはなぜですか?
一方で、疫病のようにテンプレートを避ける人もいるようです。ジェネリック型の概念そのものがプログラミング コミュニティの多くにとってなじみのないものであった 10 年前に、私はこれを理解することができました。しかし現在、一般的な静的型付けオブジェクト指向言語はすべて、何らかの形式のジェネリックをサポートしています。親しみやすさが増したことで、保守的な態度を調整する必要があるようです。
そのような保守的な態度の 1 つが、最近私に表明されました。
必要以上に一般化してはいけません - ソフトウェア開発の基本ルール。
これが自明であるべきかのように否定的に述べられているのを見て、私は非常に正直に驚いた. 個人的には、特に指定しない限り、すべてがジェネリックである Haskell のような言語では、自明とはほど遠いと思います。そうは言っても、私はこの視点がどこから来ているのか理解していると思います。
心の奥底では、そのようなルールがぐるぐる回っています。それが最前線にある今、私は常に全体的なアーキテクチャに照らしてそれを解釈してきたことに気づきました. たとえば、クラスがある場合、いつか使用する可能性のある大量の機能をクラスにロードしたくありません。具体的なバージョンが 1 つだけ必要な場合は、わざわざインターフェイスを作成しないでください (ただし、モック可能性はこれに対する反論になる可能性があります)。そういうもの...
ただし、私はこの原則をミクロレベルで適用することはしません。特定の型に依存する理由のない小さなユーティリティ関数がある場合は、テンプレートを作成します。
それで、あなたはどう思いますか?何を過度に一般化していると思いますか? この規則は、文脈によって適用可能性が異なりますか? これが規則であることに同意しますか?
c# - C#ジェネリックTがベースであることを定義する方法:ここでTp:ベースとコールベース方法
紛らわしい状況です。
基本ジェネリックタイプおよび後継
一般的なループのように見えます)))
私は次のような方法が必要です
ジェネリックメソッドでは、TがBaseTypeであり、その上でexecメソッドであることを定義する必要があります。どうやってやるの????
c++ - テンプレートテンプレートトータルスペシャライゼーション
テンプレートテンプレートの仕様は次のようになります。
このテンプレートの全体的(または部分的)な特殊化をどのように作成する必要がありますか?これは可能ですか?
f# - f# でボイラープレートを破棄する
私はHaskell プログラミング言語でScrap Your Boilerplateライブラリと Uniplate ライブラリを使用しましたが、判別共用体に対する汎用プログラミングの形式が非常に役立つことがわかりました。f# プログラミング言語に同等のライブラリはありますか?
c++ - テンプレート化された関数への入力として使用される関数からの void 戻り値は、パラメーターとして認識されます
いくつかのメソッドを持つターゲット クラスがあるとします。
そして Value クラス (コンセプトは Boost.Any に似ています):
そして、Subject クラスのメソッドを使用して Value オブジェクトを生成したいと考えています。
VC++2008 で次のエラーが発生します。
および gcc 4.4.3:
これのコンテキストは、テンプレート化されたクラス内で使用する場合です。
何かを返すメソッド (つまり intReturn) でこの Method クラスを使用すると、次のようになります。
ただし、これを voidReturn メソッドで行うと:
上記と同様のエラーが発生します。
1 つの解決策は、メソッドを void 戻り値の型にさらに部分的に特殊化することです。
見た目が悪いだけでなく、すでに多くのコードの重複を伴う X 個のシグネチャ パラメータに対して Method クラスを特殊化し (Boost.Preprocessor がここで役立つことを願っています)、void 戻り型の特殊化を追加したいと考えています。その複製作業が 2 倍になるだけです。
void 戻り型のこの 2 番目の特殊化を回避する方法はありますか?
c# - ジェネリック型の継承
ジェネリック型に Where を使用するのを手伝ってくれる人はいますか? double型またはint型の数でSTを実行する関数を作成しようとしていたので、それは汎用関数であるべきだと言いました。しかし、そのジェネリック型の変数に値を割り当てようとすると、数値型ではないためできません。また、Where を使用して int または double データ型からジェネリック型を継承することはできません。
コードは次のとおりです。
public static T[,] Unit(int n) where T : PROBLEM
{
}
誰でも助けることができますか?
actionscript-3 - AS3 (オブジェクトの) 配列から要素を一般的に削除する
配列からオブジェクトを一般的に削除する方法はありますか?
(array.filter を使用していないか、新しい配列を作成していない可能性があります)
例:
現在、array.splice() を使用してオブジェクトを削除しています
さまざまな種類のオブジェクトに使用できるように removeElement を記述したいと考えています。
現在、removeElement は実装に依存しています。
ファイル名を指定してファイルの配列からファイルを削除したい場合、条件を変更して「removeElement」を再度記述する必要があるとします。
また、基準をさまざまな基準に変えることはできますか?例 :
「サイト」プロパティが「http://www.mysite.com/6」に等しいオブジェクトをarrから削除します(上記の例を使用)
皆さんありがとう。