3

<>私はC++を使用しており、約100個のテンプレートパラメーターを持つクラスを含むライブラリを計画しています。もちろん、n個のテンプレートパラメータがあるのではないかと心配していました。ユーザーがすべての組み合わせを必要とする場合、2 ^ n個の異なるクラスがあり、これは一種のコード爆発です。ただし、ユーザーはそのために2^nのインスタンス化を行う必要があります。

私の質問は次のとおりです。非常に多くのテンプレートパラメータに関する主な技術的問題は何ですか?

ノート:

  • 技術的には、読みやすさやデザインなどの主観的な答えには興味がありません。
    • ランタイム
    • コードサイズ
    • 許可されるテンプレートの最大数

コードサンプル:

// here we have 2, but I have 100 template parameters
template<typename T1, typename T2>
class Class
{
    T1 x;
    T2 y;
    int add(T1 _x, T2 _y) { return _x+_y; } // 4 instanciations possible?
    Class<T2, T1>* swap() { return new Class<T2, T1>(); } // always 2 instanciations?
};
4

3 に答える 3

4

実際にテンプレート化されたクラスタイプは、コンパイル時に決定されます。これは、2 ^ nの異なるクラスがあることを意味するのではなく、nのクラスしかないことを意味します。コンパイル時に適切な型が置き換えられ、クラスのメンバー/関数はそれらを使用している型のみになります。

例えば

template <class Type1, class Type2>
class A
{
private:
    Type1 member_x;
public:
    Type2 GetTypeValue(Type1, Type2);
};

このようにインスタンス化された場合:

A<int, string> *x = new A<int, string>();

整数型のメンバーと文字列型のメンバーを持つクラスとしてのみコンパイルされています。関数なども同様です。

更新: 以下の更新された例では、関数のインスタンスは1つだけであり、パラメーターとstringを受け取る戻り関数になります。intstring

于 2012-09-27T11:51:31.333 に答える
3

主な考慮事項はコードサイズであり、これはパフォーマンスに影響を与える可能性があります。異なるテンプレートのインスタンス化ごとに、使用されるすべてのメンバー関数(または、ユーザーが手動でテンプレートのインスタンス化を行う場合はすべて)を生成する必要があります。異なるテンプレートのインスタンス化の間でコードが再利用されることはありません。

それに加えて、多数の引数を提供する要素は処理が困難です。メンテナンスの観点から、10個の引数を持つ宣言はすでに読みにくいです。複数の行を延長するか、行の幅が非常に広くなり、すべての引数が正しい位置にあることを検査で判断するのは困難です。そのXは7番目または8番目の引数ですか?はい、数えることはできますが、苦痛になります。引数の数が100の場合、問題はさらに悪化します。

なぜそれらすべてをテンプレート引数にしたいのですか?これ以上の情報がなければ、他の提案は得られませんが、同じ問題に対して、そのレベルの複雑さを必要としない他の設計がおそらく存在します。おそらく、引数はコンパイル時に知る必要はありません(非型引数の配列/ベクトルの形式で関数/コンストラクターに渡すことができます)、またはグループ化することができます(関連するtypedefのセットを保持する1つの型テンプレート引数)..。

于 2012-09-27T12:24:40.113 に答える
1

それをする理由があります。シリアル化、解析、ドキュメント、Intellisense用の自動コードジェネレータ。すべてのヘッダーを解析して、解析されたクラスの各メンバー関数のテンプレートメンバーを持つ2番目のクラスとして自動書き込みできます。自動コードシステムがコードを記述するため、読みやすさは重要ではありませんが、サイズや、各テンプレートメンバーが自動生成されるすべての基本クラスであるタイプに基づく分岐コードからの間接参照に関係なく、任意のクラスメンバーにアクセスできます。テンプレート化されたクラス。

次に、クラスを使用するときに、タイプを調べて「タイプ」ごとに書き出す関数を使用したり、パーサーまたはIDEディスプレイへの出力として各テンプレートタイプの値を表示したりできます。そして、大雑把に言えば、インテリジェンスは完全にプリコンパイルされており、高速検索が可能です。ヘッダーファイルの変更時にコンパイルする並列プロジェクトを作成するだけで、クラスメンバーのタイプに関係なく、さまざまな特性を検索できます。

技術的に言えば、クラス内のアイテムの解析、文書化、出力、または表示の問題全体から型を取り除き、いくつかのファイルを調べるプログラムのコンパイル時にそれを行います。各メンバーには型を確認する方法があるため(cスタイルのキャストの代わりにstatic_castを使用すると、コンパイラーが型を好む理由と同様)

コードサイズは、クラスごとに1〜1で解析されるファイルと同じサイズになります。利点は、任意のプログラムメモリスペースであり、それに一致する自動書き込みタイプにキャストして、操作値または出力値を表示するタイプ対応の関数でアクセスできます。 。あるファイルで「クラス」を見つけるだけで、自動生成されたクラスの基本クラスがテンプレート形式で事前に作成されたクラスにキャストするだけで解析することなく、そのクラスのすべての情報にアクセスできる場合、インテリセンスがどれほど便利になるか想像してみてください。現在検出可能なタイプのデータを操作する方法がありました。

おそらく彼が100以上のテンプレート引数で何をしているのか

于 2020-06-15T02:21:17.237 に答える