問題タブ [template-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++ - 関数テンプレートを非表示にし、特殊化を宣言します
これはC++テンプレートのフォローアップです:ベーステンプレートのインスタンス化を防ぎます
テンプレートを使用して、暗黙的な型変換の混乱なしに関数のオーバーロードを実現します。関数テンプレートを宣言し、必要な特殊化(オーバーロード)を定義します。リンクフェーズまで間違ったコードがエラーを生成しないことを除いて、すべてが順調です。
lib.hpp:
lib.cpp:
main.cpp:
gcc出力:
main.cppのコンパイル中に失敗させたいのですが。どういうわけか、実際に実装されたスペシャライゼーションのみを宣言できますか?
私のオプションは何ですか?ターゲットはC++03で、主にgcc-4.xとVC9に興味があります。
c++ - 関数テンプレートの特殊化の重要性と必要性
C++ Primer を読んだところ、関数テンプレートの特殊化は高度なトピックであると書かれていましたが、完全に迷っています。関数テンプレートの特殊化が重要で必要な理由を誰かが例を挙げてもらえますか?
関数テンプレートは部分的な特殊化をサポートしているのに、クラス テンプレートはサポートしていないのはなぜですか? 根底にあるロジックは何ですか?
c++ - CPPUnitのテンプレート特殊化は使用されていません
以前にCPPUnitを使用したことがある場合は、assertion_traits
任意の型を処理するようにテンプレート化されたクラスをおそらくご存知でしょう。これにより、テストケースが失敗したときに、文字列以外のタイプの「実際の」値と「期待される」値を出力できます。私はこれを何度か成功裏に使用しましたが、ある特定のタイプでは機能しません。これが私のクラス、その親のクラス、およびいくつかの非メンバー演算子の部分的な宣言です(全体が巨大であり、さらに私の会社はそれを投稿させません):
そして、CPPUnitアサーションクラスを特殊化する私の試みは次のとおりです。
上で見たように、const参照も渡して、値を渡してみました。関数内の値をHWDBDateTime
(演算子とasString()
メソッドが定義されている場所なので)キャストしてみましたが、何も役に立たないようです。テストスイートのCPPファイルの先頭に配置し、プロジェクト全体のassertation_traits特殊化を含むマスターヘッダーファイルに配置しました。たとえば、RWCString用の特殊化は問題なく機能します。どういうわけか、テストケースが失敗するたびに、浮動小数点値(おそらくdouble、doubleの特殊化がCPPUnitに組み込まれている)として時間を出力するように要求されます-これが、to/fromを含めるようにした理由です上記の最小化されたコードの二重変換演算子。
私がしていることに本質的に何か問題がありますか?特殊化は、コンパイルプロセスの特定の時点で存在する必要がありますか?おそらく、その時点を見つけられなかったのでしょうか?この神話上のポイントは、翻訳単位ごとですか、それともプロジェクトごとですか?VS2008を使用しています。
c++ - テンプレート クラス メンバーの特殊化の宣言
テンプレート クラスで (静的) メンバー関数/定数を特殊化すると、宣言がどこに行くべきかについて混乱します。
これは私が何をすべきかの例です -テンプレートの特殊化に関するIBMのリファレンスから直接引用しました:
===IBM メンバーのスペシャライゼーションの例===
問題は、これをヘッダー/cpp ファイルに分割するにはどうすればよいかということです。一般的な実装は明らかにヘッダーにありますが、特殊化はどうでしょうか?
これは具体的であり、複数の定義につながるため、ヘッダー ファイルに入れることはできません。しかし、それが .cpp ファイルに入った場合、X::f() を呼び出すコードは特殊化を認識していますか、それともジェネリック X::f() に依存している可能性がありますか?
これまでのところ、.cpp のみに特殊化されており、ヘッダーには宣言がありません。コードのコンパイルや実行に問題はありません (gcc では、現時点ではバージョンを覚えていません)。特殊化を認識して、期待どおりに動作します。しかし、A)これが正しいかどうかはわかりません。何が正しいのか知りたいのですが、B)Doxygenのドキュメントが不安定で非常に誤解を招くようになっています(これについては、後で質問します)。
私にとって最も自然に思えるのは、次のようなもので、ヘッダーで特殊化を宣言し、.cpp で定義することです。
===XClass.hpp===
===XClass.cpp===
...しかし、これが正しいかどうかはわかりません。何か案は?
doxygen - C++テンプレートクラスメンバーの特殊化のためのDoxygen
クラステンプレートを作成し、それらのクラスのメンバーを完全に特殊化する必要がある場合、Doxygenは特殊化を認識しません。一般的な定義、または(特殊化のみがある場合は)最後の定義のみを文書化します。簡単な例を次に示します。
=== MyClass.hpp ===
=== MyClass.cpp ===
したがって、この場合、foo()は "Generic foo"を出力するものとして文書化され、INT_CONSTは特殊化について言及せずに5に設定されたものとして文書化され、TTYPE_CONSTは'a'に設定されたものとして文書化されます。 3.141であり、「a」が特殊なケースであるという表示はありません。
MyClass<T>
のドキュメント内、またはの新しいページでMyClass<double>
、専門分野をドキュメント化できる必要がありますMyClass<char>
。どうすればよいですか?Doxygenはこれを処理することさえできますか?Doxygenが私が欲しいものを理解するのを妨げている宣言/コード構造で何か間違ったことをしている可能性がありますか?
2つの関連するケースに注意する必要があります。
A)テンプレート化された関数の場合、特殊化は正常に機能します。例:
foo<T>()
これにより、との両方が文書化されますfoo<double>()
。
B)テンプレート全体を再宣言すると、つまりtemplate<> class MyClass<double>{...};
、MyClass<double>
別のクラスとして独自のドキュメントページが表示されます。しかし、これは実際にはまったく新しいクラスを宣言することを意味します-とそれ自体が宣言されているかどうかの間MyClass<T>
に関係MyClass<double>
はありません。MyClass<double>
したがって、クラスとそのすべてのメンバーを再宣言し、に特化したクラスメンバーのすべての定義を繰り返してMyClass<double>
、同じテンプレートを使用しているように見せかける必要があります。非常に厄介で、応急修理のように感じます。
提案?どうもありがとう :)
--Ziv
c++ - テンプレート化されたクラスのテンプレート化されたコンストラクターのC++明示的テンプレートの特殊化
私は次のようなクラスを持っています
次のような宣言のために、これを明示的に特殊化したものを書きたいと思います。
次のテストコードでは、特殊化をコメントアウトすると、g++でコンパイルされます。それ以外の場合は、テンプレートパラメータの数が間違っていると表示されます。
c++ - C++ テンプレートの非型パラメーター演算
次の方法でテンプレートを特殊化しようとしています。
ただし、コンパイラメッセージエラーが発生します
私の何が間違っていますか?ありがとう
コメントに回避策を記載しました。テンプレート特化で算数できないらしい?直感に反するようです。
これが解決すべき問題の私の最終的な解決策です。基本的に、連続インデックスは 1 回の乗算のみが必要です。
c++ - 共有機能を備えたクラステンプレートの専門分野
私はテンプレートベクトルタイプで簡単な数学ライブラリを書いています:
今、私はこれらのいくつかのために特別にいくつかの追加機能が必要です。関数を使用して特定の座標にアクセスしたいx()
とy()
します。Vector<T, 2>
これのために部分的な特殊化を作成することができます:
しかし今、私は汎用テンプレートにすでに存在するすべてを繰り返しています。
継承も使用できます。汎用テンプレートの名前をに変更するとVectorBase
、次のようになります。
ただし、問題は、すべての演算子がで定義されているため、インスタンスVectorBase
を返すことです。これらを変数VectorBase
に割り当てることはできません。Vector
Vector
これを可能にするために、暗黙の変換コンストラクターを与えることができます。
しかし、今、私はからVector
にVectorBase
、そしてまた戻って変換しています。型はメモリ内で同じであり、コンパイラはこれをすべて最適化する可能性がありますが、それは不格好に感じられ、本質的にコンパイル時の問題である潜在的な実行時のオーバーヘッドはあまりありません。
これを解決する他の方法はありますか?
c++ - テンプレート定義内のテンプレートの特殊化: これはすべてのコンパイラまたは標準的な使用法でサポートされていますか?
これは VS 2008 でコンパイルされましたが、テンプレートの非標準的な使い方のようです。
Foo<int>
テンプレートの特殊化が独自のテンプレート クラスの定義内に含まれているため、問題はありますか?
c++ - C++ ジェネリック テンプレート関数の特殊化の作成
テンプレート関数を特殊化する方法は知っていますが、ここでやりたいことは、特定のメソッドを持つすべての型の関数を特殊化することです。
私のクラスの T::bar は静的で、さまざまな戻り値の型があります。
クラスが派生する空の基本クラス ("class HasBar{};") を用意し、「特殊化された」バージョンで boost::enable_if と boost::is_base_of を使用して、これを実行しようとしました。ただし、問題は、バーがあるクラスの場合、コンパイラーがどちらを使用するかを解決できないことです:(。
「通常の」バージョンでboost::disable_ifを使用できることは知っていますが、通常のバージョンは制御しません(サードパーティのライブラリによって提供され、特殊化が行われることが予想されますが、本当にしたくありません20 ほどのクラスに明示的な特殊化を行う必要があります)、これらの関数を使用するコードをそれほど制御することはできません。T::bar を実装するクラスとそれを使用する関数だけです。
他のバージョンを変更せずに、コンパイラに「可能であれば常にこのバージョンを使用する」ように指示する方法はありますか?
編集:テンプレートクラスと明示的な特殊化を使用して別のアプローチを試みましたが、これも明らかに許可されていません...とにかくこのアプローチを機能させるには?