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

c++ - 複雑なテンプレートを継承で特殊化する方法 - C++

このテンプレートを特殊化するための正しい構文が見つからないようです:

テンプレート パラメーターとして保持したいが<Object>、他のすべてのパラメーターを特殊化します。私はこのように試しています:

これによりエラーが発生します。

テンプレートを特殊化するための正しい構文と、特殊化されたバージョンをインスタンス化するための構文を誰かが提供できますか?

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

c++ - 部分的に特殊化されたクラスでのタグディスパッチと静的メソッド

がPODタイプのvoid f<T>()場合は1つのことを行い、非POD(またはその他の任意の述語)の場合は別のことを行うジェネリック関数を作成するとします。TT

これを実現する1つの方法は、標準ライブラリがイテレータカテゴリで行うように、タグディスパッチパターンを使用することです。

別の方法は、部分的に特殊化されたタイプの静的メンバー関数を使用することです。

ある方法を他の方法よりも使用することの長所と短所は何ですか?どちらをお勧めしますか?

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

c++ - C ++:voidの部分関数の特殊化は許可されていません-代替ソリューション?

部分関数テンプレートが混乱して不要であると見なされ、C ++標準で許可されていない理由は、今では理解できたと思います。ただし、部分的な特殊化なしで次の関数を言い換えるのに役立つことを感謝します。FWIW、関数は非特殊クラスのメンバーです:

ここでの問題は、関数の戻り型をオーバーロードできないことです。また、私が専門にしたい型名は関数パラメーターとして使用されていません-オーバーロードが役に立たないもう1つの理由です。はい、オーバーロードを強制するためにダミーパラメータを導入することはできますが、それは醜いですね。

最後に、なぜ一体がC ++の型を「無効」にしないのですか?それは物事をはるかに一貫性のあるものにするでしょう...しかし、私はおそらく全体像を見逃しています...

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

c++ - 部分的なテンプレートの特殊化

テンプレートクラスがあるシナリオがあります

次に、Xが特定の型である場合にA()メソッドの動作を変えたいと思います(ただし、BとCは同じままで、実際のコードには実際には約10個の他のメソッドがあり、そのうちのいくつかは非常に長く、頻繁に調整する必要があるため、フルクラスの特殊化を避け、フルクラスの実装をコピーして貼り付けます)

私は続けて書いた:

しかし、私のコンパイラ(clang 163.7.1)は、これをあらゆる種類のテンプレートの特殊化と見なすことさえ拒否しました。

私がコードを書いた方法に隠された構文エラーがありますか、それともこのコーディングスタイルは無効なC ++ですか?残念ながら、他のコンパイラがこのイディオムをサポートしていても、私の会社はclangで立ち往生しています。

これについて助けてくれてありがとう。

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

c++ - テンプレートの特殊化における関数定義の重複の回避

クラスWidgetには、すべてのパラメータータイプに適用されるいくつかの関数(共通関数)と、特定のタイプに特化する必要があるその他の関数(一般的でない関数)があります。

g ++は、ウィジェットの特殊化はuncommon_fn()だけでなくcommon_fn()も定義する必要があると主張していますが、そもそも特殊化を使用する目的を無効にしています。common_fn()の繰り返しを回避するにはどうすればよいですか?

開始-編集

アルフへ:

使えない

いくつかの珍しい関数は特性タイプを返す必要があるためです(したがって、実際のタイプをプリミティブにすることによって単純化するのは過剰でした)。

typename Foo::Barまたは、実際にコンパイラに書き込み時に認識させる方法はありますか

終了編集

begin-edit2

iammilindへ:

これは興味深いことですが、同じ理由でWidgetからの派生(または共通部分を親クラスGeneralWidgetにリファクタリングするより明確なソリューション)を使用することはできません。共通部分は完全に共通ではありません。それらの宣言と定義は同じように見えますが、特性を使用しているため、最終的にはまったく異なります。

end-edit2

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

c++ - トレイトを使用する場合、部分的なテンプレートの特殊化で関数定義の重複を避ける

以下のコードで、すべての特殊化の間で common_fn() をどのように共有しますか ( Widget<A<T> >TWidget<B<T> >が何であっても)。

私は以前、質問をその本質だと思うものに単純化しようとしましたが、部分的な専門化と特性の文脈で質問する必要があることがわかりました.

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

c++ - ネストされた特殊化されていない型によるテンプレートの特殊化

ネストされた部分的なテンプレート特殊化の構文を理解するのに問題があります。どう考えても正しい言い方だと思います。私が欲しいのはas()、キャストされた値を返す関数です。ほとんどの場合static_castは問題なく動作するので、それを行う汎用バージョンがありますが、場合によっては具体的にしたいことがあります。私が抱えている問題は、共通のtypename.

それがセットアップです。実際、それが最善の方法であるかどうかは100%確信が持てませんが、GCCでコンパイルされ、動作するようです.. とにかく。Eigen::Matrix<T,4,1>ここで、部分的にテンプレート化された別のテンプレート化された型 (この場合は-- しかし、おそらくまたは別の型も使用される可能性があります。つまり、 a から aへのstd::vectorキャスト)に特化したいと考えています。std::vector<T>std::list<T>

これは意味がありますか?異なるサイズの Eigen::Matrix を取り、それらを特別に処理するわずかに異なるバージョンはどうですか?

上記の 2 つのコード ビットが機能せず、構文がおそらくひどいものであることはわかっています。これを解決しようとしています。これが重複している場合はご容赦ください。私はいくつかの同様の質問を見ましたが、どれもこれに関するものではないようでした.

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

c++ - プライマリ テンプレートよりも部分的な特殊化が常に優先される方法はありますか?

私は自問しています

パラメーターのテンプレート引数の任意のセットに対して、部分的な特殊化がコンパイラによって取得されるように、クラス テンプレートと対応する部分的な特殊化を記述できますか?

例えば

これはどういうわけか可能であると読んだことを覚えているようですが、これを機能させるための正確なアルゴリズムを忘れていました。

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

c++ - 複数のテンプレート引数エラーによるテンプレートの部分的な特殊化

テンプレート引数が 1 つのクラスでテンプレートの部分特殊化を使用すると、次のようにメソッドを特殊化できます。

メソッド foo は Dim = 1 に特化しています。しかし、クラスにテンプレート引数を追加するとすぐに、次のようになります。

(VS2010 の) コンパイラは、次のエラーで不平を言います:

私の見方では、あいまいさはなく、コンパイラはすべてを解決して、引数が 1 つの場合と同じように機能するはずです。

これが C++ でサポートされていない場合は、その理由を説明してください。