問題タブ [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++ - 関数ローカル静的 Const 変数の初期化セマンティクス
質問を詳しく読むのが面倒な人のために、質問は太字になっています。
これは、この質問のフォローアップです。これは、関数内の静的変数の初期化セマンティクスに関係しています。静的変数は一度初期化する必要があり、それらの内部状態は後で変更される可能性があります-私が(現在)リンクされた質問で行っているように。ただし、問題のコードでは、後で変数の状態を変更する機能は必要ありません。
文字列オブジェクトの内部状態を変更する必要がないため、私の立場を明確にさせてください。このコードは、メタ プログラミング用の特性クラス用であり、const char * const ptr の恩恵を受けるため、理想的にはローカル コストの static const 変数が必要です。私の経験に基づいた推測では、この場合、問題の文字列はリンクローダーによってメモリに最適に配置され、コードはより安全になり、意図したセマンティクスにマップされます。
これは、そのような変数のセマンティクスにつながります。「C++ プログラミング言語第 3 版 -- Stroustrup」には、この問題について (私が見つけた限りでは) 何も言うことがありません。つまり、変数は、スレッドの制御フローが最初にコードに到達したときに 1 回初期化されるということだけです。これにより、次のコードが適切かどうか、またそうでない場合、意図されたセマンティクスは何かを考えるようになります。
以下は GCC でコンパイルし、「yahoo」を 2 回出力します。これが私が望むものです-しかし、それは標準に準拠していない可能性があります(これが私がこの質問を投稿する理由です)。"SetString" と "String" の 2 つの関数を使用して、後者が最初の関数に転送されるようにする方がエレガントな場合があります。標準に準拠している場合、誰かがブースト(または他の場所)でのテンプレートの実装を知っていますか?
編集: 2010 年 5 月 11 日
次のマクロを使用して、コンパイル時の情報をエンコードするクラスで上記のゲッター/セッターを生成しています。
これらのマクロは、クラス宣言内に配置されます。例えば:
うまくいけば、これは他の人に役立つでしょう。
scheme - 慣用的なスキームとジェネリックプログラミング、なぜ数字だけに?
スキームでは、+、-、*、/などのプロシージャはさまざまなタイプの数値で機能しますが、他の一般的なプロシージャはあまり見られません。
たとえば、lengthはリストでのみ機能するため、vector-lengthとstring-lengthが必要です。
この言語は、Haskellの「型クラス」や標準化されたオブジェクトシステムのようなジェネリックプロシージャ(もちろんcondを除く)を定義するためのメカニズムを実際には提供していないという事実から来ていると思います。
私が知らない一般的な手順を処理する慣用的なスキームの方法はありますか?
delphi - TypeIdentifier(T)がオブジェクトかどうかを確認するには?
Array(Array of ) 型のメンバーを持つジェネリック リスト クラスを作成しています。問題は、クラスが byte から TObject を継承する型までの型に使用されることになっているため、クラスの破棄です。
具体的には:
たとえば、T が TObject であるかどうかを確認して、typeidentifier がクラスの場合にすべてのメンバーを解放するにはどうすればよいですか?
c++ - C++、汎用プログラミング、および仮想関数。どうすれば欲しいものを手に入れることができますか?
これは、テンプレートを使用してやりたいことです。
これらのメソッド宣言を提供すると同時にそれらを仮想化するテンプレートクラスから単純に派生するクラスが必要です。これは私が思いついたものです:
ただし、おそらくご想像のとおり、継承した 6 つのメソッドのいずれもオーバーライドできません。ここで明らかに何かが欠けています。私のエラーは何ですか?いいえ、これは宿題ではありません。これは好奇心です。
c++ - テンプレートを使うデメリットは?
いくつかの欠点は次のとおりです。
- その構文は複雑です
- コンパイラは余分なコードを生成します
delphi - OOGenericsの設計にエラーがあります。どうすれば回避できますか?
3番目のクラスで「E2511タイプパラメータ'T'はクラスタイプである必要があります」というメッセージが表示されます。
任意のデータ型(ParentParentClass)のライトジェネリック配列ラッパーを作成しようとしていますが、型の識別子を解放できないため(TがTObjectの場合はTobject(T).Free)、2番目のクラスを作成しました。クラス型に便利なので、オブジェクトを解放できます。
3番目のクラスはラッパーを使用する場所ですが、コンパイラーはそのエラーをスローします。どうすればコンパイルできますか?
delphi - Delphi ジェネリックにおけるポリモーフィズム
g.test はクラスのインスタンスを返す必要があります。私は複数のことを試しました:
これの目的は、クラスの汎用配列を作成することです。配列はジェネリック クラス内に格納され、インスタンスを返しますが、どのように?
これを達成できれば、コードを 3 回短縮できますが、それはできません。解決策を提案してください。
c++ - 任意の型を含む任意の STL コンテナーの関数テンプレート
任意の型 T の要素を含む任意の STL コンテナー C があります。すべての要素のコピーを持つ std::vector を作成したいと考えています。これを行う最もクリーンな方法は何ですか?
c++ - メンバー関数 C++ の派生テンプレート オーバーライド戻り値の型
私は行列クラスを書いています。この定義を見てください:
generic_square_matrix クラスは、行列の乗算などの追加機能を提供します。これを行うことは問題ありません:
コンストラクターにより、タイプが generic_square_matrix でなくても、任意の正方行列を M に割り当てることができます。これが可能なのは、サポートされている関数のみで、データが子全体で変更されないためです。これも可能です:
ここでも同じ変換が適用されます。しかし、ここで問題が発生します。
これを解決するには、generic_square_matrix::minor が generic_matrix の代わりに generic_square_matrix を返すようにします。これを行う唯一の方法は、テンプレートの特殊化を使用することだと思います。しかし、特殊化は基本的に別のクラスのように扱われるため、すべての関数を再定義する必要があります。派生クラスの場合とは異なり、特殊化されていないクラスの関数を呼び出すことはできないため、関数全体をコピーする必要があります。これはあまり優れたジェネリック プログラミング ソリューションではなく、多くの作業が必要です。
C ++には、私の問題に対する解決策がほとんどあります。派生クラスの仮想関数は、基本クラスが返すクラスから派生したクラスである場合、基本クラスが返すものとは異なるクラスへのポインターまたは参照を返すことができます。generic_square_matrixはgeneric_matrixから派生していますが、関数はポインターも参照も返さないため、ここでは当てはまりません。
この問題の解決策はありますか (まったく別の構造が関係している可能性があります。私の唯一の要件は、次元がテンプレート パラメーターであり、正方行列に追加機能を持たせることができることです)。
前もって感謝します、
ルード
c++ - 汎用データ型へのポインタ、参照、ハンドルを可能な限り汎用的かつ柔軟に使用する
私のアプリケーションには、Car、Bicycle、Person など、さまざまなデータ型がたくさんあります (実際には他のデータ型ですが、これは単なる例です)。
私のアプリケーションにはかなりの「ジェネリック」コードもあり、アプリケーションはもともと C で書かれていたため、車、自転車、人などへのポインタは、ID とともにこれらのジェネリック モジュールへの void ポインタとして渡されることがよくあります。次のようなタイプの
「ShowNiceDialog」メソッドはメタ情報 (DATATYPE_CAR をインターフェイスにマップして Car から実際のデータを取得する関数) を使用して、指定されたデータ型に基づいて車の情報を取得するようになりました。そうすれば、新しいデータ型ごとに毎回ではなく、ジェネリック ロジックを 1 回だけ記述する必要があります。
もちろん、C++ では、次のように共通のルート クラスを使用することで、これをはるかに簡単にすることができます。
問題は、場合によっては、データ型をクラスに格納したくないが、メモリを節約するためにまったく異なる形式で格納したいことです。場合によっては、アプリケーションで管理する必要がある数億のインスタンスがあり、すべてのインスタンスに対して完全なクラスを作成したくない場合があります。2 つの特性を持つデータ型があるとします。
- 数量 (double、8 バイト)
- ブール値 (1 バイト)
この情報を格納するのに 9 バイトしか必要ありませんが、クラスに入れると (パディングのため) 少なくとも 16 バイトが必要になり、v-pointer を使用すると 24 バイトも必要になる可能性があります。数億のインスタンスの場合、すべてのバイトがカウントされます (アプリケーションの 64 ビット バリアントがあり、場合によっては 6 GB のメモリが必要です)。
void-pointer アプローチには、void-pointer でほとんど何でもエンコードし、そこからの情報が必要な場合にそれを使用する方法を決定できるという利点があります (実際のポインターとして、インデックスとして使用するなど)。型安全性のコスト。
汎用ロジックはアプリケーションのかなりの部分を形成するため、テンプレート化されたソリューションは役に立ちません。これらすべてをテンプレート化することは望ましくありません。さらに、データ モデルは実行時に拡張できます。これは、テンプレートが役に立たないことも意味します。
void-pointer よりもこれを処理するためのより良い (そして型安全な) 方法はありますか? これに関するフレームワーク、ホワイトペーパー、研究資料への参照はありますか?