問題タブ [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 投票する
2 に答える
477 参照

c++ - 2つのミックスインテンプレート間にポリモーフィックな動作を実装するにはどうすればよいですか?

基本(テンプレート)クラスのいくつかの「拡張」動作をサポートするために、C++テンプレートを使用してミックスインを実装しています。

継承グラフに別のミックスインが存在する場合は、1つのミックスインの動作を変更する必要があります。(理想的には、これはどちらが最初に混合されたかには関係ありませんが、特定の順序で派生する必要があるという制限を受け入れます。)

言い換えれば、私が持っている場合:

M1が混在している場合、M2メソッドの動作を変更する必要があります-M1は、M2結果の計算に使用する必要のあるデータメンバーを提供します。一方、M2は、M2が混在していない場合に完全に無効になるデータメンバーについて一定の保証を行います。

では、私の質問は、このC ++'03をどのように実装するかということです。

テンプレートメソッドと特殊化を使用する方法があると思いますが、私のtemplate-fuは(まだ)十分に強力ではありません。


dauphicの応答に従って、私はこれを試しました、そしてそれはうまくいきます。M2テンプレートを完全に複製する必要があるのは恐ろしいので、次にSFINAEアプローチを試してみます。


少し苦労した後、SFINAEバリアントも機能させることができました。この部分を除いて、コードはほとんど同じです。

以下で説明するように、enable_if <>テンプレートはブール式を処理しないため(私にとって)、disable_if<>を使用しました。これでうまくいくようです。

このコードは現在boostを使用していないプロジェクトに提供される予定であり、テンプレート全体を複製するオプションはメンテナンスの悪夢であるため、これらはどちらも特に満足のいくものではありません。しかし、彼らは両方とも仕事を成し遂げます。ブーストコードが標準になり、頭痛が少なくなることが期待されているという理由だけで、ブーストソリューションを答えと考えます。

皆さん、ありがとうございました。

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

c++ - C++ テンプレート特殊化メソッドの定義

次のコードは正常に動作します。定義と用途を持つ単純なテンプレート クラスです。

次に、次を追加すると(メインの上ですが、テンプレートクラス foo; の宣言の後)

g++ からエラーが発生します

19 行目: エラー: 'std::string foo::what()' のテンプレート ID 'what<>' がどのテンプレート宣言とも一致しません

エラーを示すコードパッドは次のとおりです。http://codepad.org/4HVBn9oJ

私が犯している明らかな間違いは何ですか?または、これは c++ テンプレートでは不可能ですか? すべてのメソッドをインラインで定義すると (template<> foo の定義を使用して) 機能しますか?

ありがとうございました。

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

c++ - C ++関数テンプレート、Intパラメータの質問

なぜこれが機能しないのか興味がありました:

この関数を使おうとすると、最初に定義したテンプレートの特殊化が呼び出されます。したがって、特殊化の順序を逆にしない限り、上記のコードを呼び出しますmap<ASSIGN_RIGHT>。そうしないと、常に。が呼び出されます。map<ASSIGN_LEFT>map<ASSIGN_RIGHT>

出力は

これは、構造体からデータを入出力するために2つのルーチンを作成する必要がないようにするためです。

補助的な質問-テンプレートパラメータの上に「int」を作成したいのですが、明らかに部分的な特殊化を行うことはできません。それを回避する方法を見つけたいと思います。

前もって感謝します。

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

c++ - テンプレートクラスが特殊化されていない場合のメンバー関数の特殊化されたテンプレートの回避策

std のようなインターフェイスを使用してデータ構造クラスを構築し、データ構造にさまざまな反復子を実装しています。

概念的には、私がやりたいことは次のようなものです。

ただし、これはもちろんコンパイルされません。C++ では、特殊化されていないテンプレート コンテナーでテンプレート メンバー関数を特殊化することが許可されていないためです。

明らかな回避策は、もちろん、Begin_Iterator1 と Begin_Iterator2 の 2 つの異なる関数を宣言し、それを実行することです。しかし、インターフェイスを変更しない回避策を探しています。

何か案は?

編集:これはHW割り当てのためであることを忘れていたので、boostやstdでさえオプションではありません。

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

c++ - 使用ポイントの後にテンプレート関数を特殊化すると、コンパイルが中断されます

次の例を考えてみましょう:

コンパイルは失敗し、次のエラーメッセージが表示されます。

標準のどの段落がこのエラーを説明していますか?

PS:mainの前に関数定義を移動すると、エラーがなくなることを知っています。

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

c++ - C ++、テンプレートの特殊化の問題

テンプレートクラスの特殊化に問題があります。以下のコードを参照してください。

PointのContainerクラスを特殊化することは可能ですか?

更新された質問:

次のコードを試しましたが、有効ですか?

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

c++ - テンプレート クラス メンバー関数のみの特殊化

テンプレートに関する完全なガイドを読んでいますが、次のように書かれています。

クラステンプレートの特殊化について話しているところ。

クラス テンプレートの 1 つのメンバー関数を特殊化することは可能ですが、いったん特殊化すると、特殊化されたメンバーが属するクラス テンプレート インスタンス全体を特殊化することはできなくなります。

メンバー関数がまったくなくても特殊化できるため、これがどのように当てはまるのか実際に疑問に思っています。メンバー関数を 1 つだけ持つ特殊化と、すべてのメンバー関数を持つ別の特殊化を行うことはできないということですか?

誰かが明確にしてもらえますか?

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

c++ - テンプレート化されたクラスにネストされた型による部分的な特殊化

テンプレートと部分的な特化で遊んでいますが、書き方がわからない特化が 1 つあります... 読みやすくするためにコードを単純化します。

考えてみよう

通常、私は次のように専門化できます。

テンプレート タイプでも機能します。

ここで、テンプレート化されたクラスにネストされた型の特殊化を行いたいと思います:

これは失敗します。y::nested_type の前に 'typename' を入れようとしましたが、問題は解決しませんでした。コンパイラ エラーは次のとおりです。

私がやりたいことは論理的に思えますが、それが可能かどうかはわかりません。g++-4.5 で C++0x を使用しています。そのような特殊化を書くための正しい構文を知っている人はいますか?

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

c++ - C++ テンプレートの型のサブセットに特化する

C++ でのテンプレートの特殊化について質問があります。誰かが助けてくれることを願っています。3 つのテンプレート パラメーターを持つクラスがあります。

私がやりたいことは、たとえばタイプ C に特化しているが、タイプ A と B には一般的な myFunc のいくつかのバージョンを作成することです。したがって、次のような完全にテンプレート化された関数は必要ありません。

このような完全に特殊化された関数は必要ありません

代わりに、似たようなことをしたい

クラス型 C が int の場合、myFunc() の 1 つのバージョンを呼び出し、クラス型 C が double の場合、myFunc の別のバージョンを呼び出すという考え方です。テンプレートの特殊化構文のさまざまな組み合わせ (ここにリストするには多すぎる) をたくさん試しましたが、どれもコンパイルできないようです。

誰かがここで私を正しい方向に向けることができますか? よろしくお願いします。

マイケル

0 投票する
4 に答える
1417 参照

c++ - テンプレートクラスをパラメーターとしてテンプレート構造体を特殊化する

マトリックスとそれらのマトリックスに対する操作を含むライブラリを作成することにより、テンプレートのスキルを向上させようとしています (私はほとんど知りません)。基本的に、行列を非常に強く型付けし (コンパイル時にデータ型とサイズがわかる)、転置行列の型を自動的に推定できるようにしたいと考えています。

template< typename TDataType, size_t rows, size_t cols > class MyMatrix

行列は入れ子にするTDataTypeことができるので、整数型にすることもできますが、MyMatrix<...>単独で行うこともできます。これにより、転置行列のデータ型が元の行列のデータ型と必ずしも同じになるとは限りません。たとえば、 Transpose( MyMatrix< MyMatrix< char, 2, 3 >, 4, 6 > ) ==> MyMatrix< MyMatrix< char, 3, 2 >, 6, 4 >(外部行列のデータ型が変更された)

転置型推定の私の最初の試みは次のとおりです。

Transpose-template を MyMatrix (TDataType 不明および同様のエラー) で特殊化できないように見えるため、これを行う方法が見つかりませんでした。

私が思いついた唯一のコンパイル可能なソリューションは次のとおりです(まだ機能するかどうかさえわかりません):

私は物事を複雑にしすぎていると思います。私が望むものを達成するためのより簡単な解決策はありますか?


私の質問への回答への回答 (私はアカウントなしで質問を投稿したので、通常の方法で物事を行うのに十分な担当者がいません)。もう本当にありがとう!

@Bo Persson @Will A : これを汎用行列ライブラリとして使用するつもりはありません。特定の (事前にわかっている) サイズの行列に対して操作を実行し、このアプローチを使用してどこに到達できるかを確認したいと考えています。これにより、行列のメモリ レイアウトを最適化し (たとえば、行ベクトルを 32 バイト境界に揃える)、その他のファンキーなことを実行できるようになります。これを行うことで何度も自分の足を撃つことを期待していますが、ここで得ようとしている主なことは経験であり、何が機能し、何が機能しないかを見つけます (そして、何が難しいか、何がそうでないか) 't)。

@Bo Perrson : 最初のバージョンがコンパイルされない理由はわかっていますが、2 回目の試行で動作するより単純なバージョンがあるかどうか疑問に思っていました。主な問題は、MyMatrix がクラス テンプレート自体であり、そのテンプレート引数をどうにかして Transpose-struct に取得する必要があることです。

@VJo:うまくいかないと思います。T が MyMatrix<..> 自体である場合、転置行列はTranspose<T> T 自体ではなく、データ型として持つ必要があります。すべての基本型 (char、int、double...) については、もちろんこれは正しく、より簡単です。