問題タブ [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.
c++ - 部分的なテンプレートの特殊化による「不完全な型の無効な使用」エラー
次のコード:
エラーが表示されます
(私は gcc を使用しています。) 部分的な特殊化の構文は間違っていますか? 2 番目の引数を削除すると、次のようになることに注意してください。
その後、正しくコンパイルされます。
language-agnostic - 「部分専門化」をサポートする他の言語は何ですか?
部分的なテンプレートの特殊化は、C++ でのジェネリック プログラミングの最も重要な概念の 1 つです。例: 一般的な swap 関数を実装するには:
O(1) スワップをサポートするベクトルに特化するには:
そのため、汎用関数で swap(x, y) を呼び出すと、常に最適なパフォーマンスを得ることができます。
代替言語で同等のもの(または言語がスワップの概念をサポートしていない場合は、言語の部分的な特殊化の標準的な例)を投稿できれば、非常に感謝しています。
編集:したがって、回答/コメントした多くの人々は、部分的な特殊化が何であるかを本当に知らず、一般的なスワップの例が一部の人々の理解を妨げているようです。より一般的な例は次のとおりです。
部分的な特殊化は次のようになります。
完全な専門化は次のようになります。
なぜこれが重要なのですか?ジェネリック関数で foo(anything) を呼び出すことができるため:
コンパイル時に最も適切な実装を取得します。これは、C++ が最小限のパフォーマンス ペナルティで抽象化を実現する 1 つの方法です。
「部分専門化」の概念を明確にするのに役立つことを願っています。ある意味で、これは C++ が明示的なパターン マッチング構文 (Ocaml/F# の match キーワードなど) を必要とせずに型パターン マッチングを行う方法であり、ジェネリック プログラミングの邪魔になることがあります。
c++ - 動的ディスパッチのための部分的なテンプレートの特殊化
(型ではなく) 整数値でテンプレート化された関数の動的ディスパッチャを作成しようとしています。コード ジェネレーターを作成するか、大きなマクロ チェーンを使用してディスパッチャー ソースを作成することもできますが、テンプレート化されたソリューションの方が洗練されているようです。
ディスパッチャを単純なフォームに落とし込みました (これは実際にはディスパッチを行いません):
これを gcc 4.1.1 でコンパイルすると、次のエラーが発生します。
どうやら、再帰オブジェクトを作成しようとすると、コンパイラはこれを新しいテンプレートをインスタンス化する要求として処理していません。
助言がありますか?
c# - C# でテンプレートの特殊化を行う方法
C# の専門化はどのように行いますか?
問題を出します。テンプレートの種類がありますが、それが何であるかわかりません。XYZ
しかし、それが呼び出したいから派生したものかどうかはわかります.alternativeFunc()
。優れた方法は、特殊化された関数またはクラスを呼び出してnormalCall
return.normalFunc()
を持ちながら、派生型の他の特殊化XYZ
を呼び出して呼び出すこと.alternativeFunc()
です。これは C# でどのように行われますか?
c++ - C ++部分特殊化(関数ポインター)
以下が合法的なC++であるかどうか、誰か教えてもらえますか?
//部分的な特殊化
g ++(4.2.4)エラー:定数式エラーに関数呼び出しを表示できません:テンプレート引数2が無効です
明示的な特殊化には機能しますが
c++ - すべての派生型のクラス テンプレートを部分的に特殊化する方法は?
std::tr1::hash
変更できない既存のテンプレート ( ) を基本クラスとすべての派生クラスに部分的に特化したいと考えています。その理由は、ポリモーフィズムに奇妙に繰り返されるテンプレート パターンを使用しており、ハッシュ関数が CRTP 基底クラスに実装されているためです。CRTP 基底クラスに部分的に特化したい場合は簡単です。次のように書くだけです。
しかし、この特殊化は実際の派生クラスとは一致せず、CRTPBase<Derived>
. 私が欲しいのは、Derived
それがから派生した場合にのみ、部分的な特殊化を書く方法ですCRTPBase<Derived>
。私の疑似コードは
...しかし、コンパイラはそれenable_if<condition, Derived>::type
がDerived
. を変更できる場合は、ドキュメントで推奨されているように、std::tr1::hash
使用する別のダミー テンプレート パラメータを追加するだけですが、それは明らかにあまり良い解決策ではありません。この問題を回避する方法はありますか? 作成するたびにカスタム ハッシュ テンプレートを指定する必要がありますか、それとも派生クラスごとに完全に特化する必要がありますか?boost::enable_if
enable_if
unordered_set
unordered_map
hash
c++ - テンプレートパラメータとしてのポインタ?
私はコンテナクラスを持っています、私たちはそれを呼びます
T がポインター型の場合、このクラスで何か違うことをしたいです。たとえば、次のようなものです。
ここで、 SomeWrapperClass は、そのパラメーターとして指定されたものの型を期待しています。残念ながら、この構文はうまく機能せず、掘り下げても、このようなものを機能させる良い方法は見つかりませんでした。
なぜこのようにするのですか?非常に大きなアプリで、一部のコンテナーが特化している型がポインターである場合とポインターではない場合の動作を変更したい - 理想的には、〜 1,000 の場所を変更せずに変更したいCVector<Object*>
vsなどのようなものがあるコードではCVector<int>
、部分的な特殊化でゲームをプレイするのが道のりのようでした。
私はここでクラックですか?
c++ - テンプレートの部分的な特殊化 - 実際の例はありますか?
について考えていpartial specialization
ます。アイデアは理解できますが、この手法が実際に使用されているのを見たことがありません。Full specialization
色々なところに使われているSTL
ので問題ありません。が使用されている実際の例について教えていただけますpartial specialization
か? その例があれば、STL
優れているでしょう!
c++ - テンプレートの特殊化のためのテンプレート化されたパラメーター?
こんにちは、テンプレート化されたクラスのサブグループ用に定義したいテンプレート化されたクラスの静的メンバーがあります。
悲しいことに、gcc 4.1.1 では次のエラーがスローされます。
D:\X\Foo.h(98) : エラー: テンプレート引数 1 が無効です
行で:template<> template<typename T> int FooT< template Foo<T> >::ms_id = 10;
私が間違っているのは、そもそも許可されている一般的な概念ですか?
c++ - C++ テンプレートの特殊化int を取得しない
次のコードがあります。
その後:
cin >> のように動作するようにしたい。つまり、lua 関数の戻り値を abc に書き込む必要がある。だから私はそのアドレスが必要です..しかし、それはデフォルトのテンプレートでデフォルト設定されています。私は何を間違っていますか?cin がまさにそれを行うので、これを行う方法は確かにあります。
ありがとう!
% を >> に変更した人への注意: そのままなので元に戻しました :D コードは Lua 関数 test("test", 5, nil, 2.333) を呼び出し、その戻り値を abc に保存します。% は関数のパラメーター用、>> は戻り値用です。