問題タブ [partial-specialization]

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.

0 投票する
5 に答える
23060 参照

c++ - 部分的なテンプレートの特殊化による「不完全な型の無効な使用」エラー

次のコード:

エラーが表示されます

(私は gcc を使用しています。) 部分的な特殊化の構文は間違っていますか? 2 番目の引数を削除すると、次のようになることに注意してください。

その後、正しくコンパイルされます。

0 投票する
6 に答える
646 参照

language-agnostic - 「部分専門化」をサポートする他の言語は何ですか?

部分的なテンプレートの特殊化は、C++ でのジェネリック プログラミングの最も重要な概念の 1 つです。例: 一般的な swap 関数を実装するには:

O(1) スワップをサポートするベクトルに特化するには:

そのため、汎用関数で swap(x, y) を呼び出すと、常に最適なパフォーマンスを得ることができます。

代替言語で同等のもの(または言語がスワップの概念をサポートしていない場合は、言語の部分的な特殊化の標準的な例)を投稿できれば、非常に感謝しています。

編集:したがって、回答/コメントした多くの人々は、部分的な特殊化が何であるかを本当に知らず、一般的なスワップの例が一部の人々の理解を妨げているようです。より一般的な例は次のとおりです。

部分的な特殊化は次のようになります。

完全な専門化は次のようになります。

なぜこれが重要なのですか?ジェネリック関数で foo(anything) を呼び出すことができるため:

コンパイル時に最も適切な実装を取得します。これは、C++ が最小限のパフォーマンス ペナルティで抽象化を実現する 1 つの方法です。

「部分専門化」の概念を明確にするのに役立つことを願っています。ある意味で、これは C++ が明示的なパターン マッチング構文 (Ocaml/F# の match キーワードなど) を必要とせずに型パターン マッチングを行う方法であり、ジェネリック プログラミングの邪魔になることがあります。

0 投票する
1 に答える
819 参照

c++ - 動的ディスパッチのための部分的なテンプレートの特殊化

(型ではなく) 整数値でテンプレート化された関数の動的ディスパッチャを作成しようとしています。コード ジェネレーターを作成するか、大きなマクロ チェーンを使用してディスパッチャー ソースを作成することもできますが、テンプレート化されたソリューションの方が洗練されているようです。

ディスパッチャを単純なフォームに落とし込みました (これは実際にはディスパッチを行いません):

これを gcc 4.1.1 でコンパイルすると、次のエラーが発生します。

どうやら、再帰オブジェクトを作成しようとすると、コンパイラはこれを新しいテンプレートをインスタンス化する要求として処理していません。

助言がありますか?

0 投票する
7 に答える
71074 参照

c# - C# でテンプレートの特殊化を行う方法

C# の専門化はどのように行いますか?

問題を出します。テンプレートの種類がありますが、それが何であるかわかりません。XYZしかし、それが呼び出したいから派生したものかどうかはわかります.alternativeFunc()。優れた方法は、特殊化された関数またはクラスを呼び出してnormalCallreturn.normalFunc()を持ちながら、派生型の他の特殊化XYZを呼び出して呼び出すこと.alternativeFunc()です。これは C# でどのように行われますか?

0 投票する
1 に答える
1479 参照

c++ - C ++部分特殊化(関数ポインター)

以下が合法的なC++であるかどうか、誰か教えてもらえますか?

//部分的な特殊化

g ++(4.2.4)エラー:定数式エラーに関数呼び出しを表示できません:テンプレート引数2が無効です

明示的な特殊化には機能しますが

0 投票する
2 に答える
4632 参照

c++ - すべての派生型のクラス テンプレートを部分的に特殊化する方法は?

std::tr1::hash変更できない既存のテンプレート ( ) を基本クラスとすべての派生クラスに部分的に特化したいと考えています。その理由は、ポリモーフィズムに奇妙に繰り返されるテンプレート パターンを使用しており、ハッシュ関数が CRTP 基底クラスに実装されているためです。CRTP 基底クラスに部分的に特化したい場合は簡単です。次のように書くだけです。

しかし、この特殊化は実際の派生クラスとは一致せず、CRTPBase<Derived>. 私が欲しいのは、Derivedそれがから派生した場合にのみ、部分的な特殊化を書く方法ですCRTPBase<Derived>。私の疑似コードは

...しかし、コンパイラはそれenable_if<condition, Derived>::typeDerived. を変更できる場合は、ドキュメントで推奨されているように、std::tr1::hash使用する別のダミー テンプレート パラメータを追加するだけですが、それは明らかにあまり良い解決策ではありません。この問題を回避する方法はありますか? 作成するたびにカスタム ハッシュ テンプレートを指定する必要がありますか、それとも派生クラスごとに完全に特化する必要がありますか?boost::enable_ifenable_ifunordered_setunordered_maphash

0 投票する
6 に答える
33708 参照

c++ - テンプレートパラメータとしてのポインタ?

私はコンテナクラスを持っています、私たちはそれを呼びます

T がポインター型の場合、このクラスで何か違うことをしたいです。たとえば、次のようなものです。

ここで、 SomeWrapperClass は、そのパラメーターとして指定されたものの型を期待しています。残念ながら、この構文はうまく機能せず、掘り下げても、このようなものを機能させる良い方法は見つかりませんでした。

なぜこのようにするのですか?非常に大きなアプリで、一部のコンテナーが特化している型がポインターである場合とポインターではない場合の動作を変更したい - 理想的には、〜 1,000 の場所を変更せずに変更したいCVector<Object*>vsなどのようなものがあるコードではCVector<int>、部分的な特殊化でゲームをプレイするのが道のりのようでした。

私はここでクラックですか?

0 投票する
3 に答える
3217 参照

c++ - テンプレートの部分的な特殊化 - 実際の例はありますか?

について考えていpartial specializationます。アイデアは理解できますが、この手法が実際に使用されているのを見たことがありません。Full specialization色々なところに使われているSTLので問題ありません。が使用されている実際の例について教えていただけますpartial specializationか? その例があれば、STL優れているでしょう!

0 投票する
3 に答える
293 参照

c++ - テンプレートの特殊化のためのテンプレート化されたパラメーター?

こんにちは、テンプレート化されたクラスのサブグループ用に定義したいテンプレート化されたクラスの静的メンバーがあります。

悲しいことに、gcc 4.1.1 では次のエラーがスローされます。

D:\X\Foo.h(98) : エラー: テンプレート引数 1 が無効です

行で:template<> template<typename T> int FooT< template Foo<T> >::ms_id = 10;

私が間違っているのは、そもそも許可されている一般的な概念ですか?

0 投票する
3 に答える
378 参照

c++ - C++ テンプレートの特殊化int を取得しない

次のコードがあります。

その後:

cin >> のように動作するようにしたい。つまり、lua 関数の戻り値を abc に書き込む必要がある。だから私はそのアドレスが必要です..しかし、それはデフォルトのテンプレートでデフォルト設定されています。私は何を間違っていますか?cin がまさにそれを行うので、これを行う方法は確かにあります。

ありがとう!


% を >> に変更した人への注意: そのままなので元に戻しました :D コードは Lua 関数 test("test", 5, nil, 2.333) を呼び出し、その戻り値を abc に保存します。% は関数のパラメーター用、>> は戻り値用です。