問題タブ [template-meta-programming]

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 に答える
2986 参照

c++ - 「部分的な特殊化で使用されていないテンプレート パラメーター」について教えてください

私は C++0x コードではなく、通常の C++ に苦労しています。通常の C++ を使わなければならない理由を聞かないでください。

だからここにあります:いくつかのステートメントが真または偽であることに関して、列挙型の値を1または0にする必要があります。もちろん、列挙型に 0 を含む構造体をテンプレート化し、列挙型に 0 ではなく 1 を含む 2 番目のステートメントで特殊化しました。

私にはかなり正当に思えますが、専門化のパラメーターを使用する必要があることがわかります。可能な限りすべての方法で使用しようとしたため、このエラーが発生し続けたため、これはちょっと奇妙です。

コードは次のとおりです。

部分的な特殊化でなければうまくいくと思いますが、明示的な特殊化は名前空間スコープではできません。そして明らかに、両方のテンプレートを特殊化せずにテンプレート内でテンプレートを特殊化することはできません。できますか?

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

c++ - テンプレートの特殊化があいまいです

さらに別のテンプレートの問題 ! 演算子 << のオーバーロードがある場合にオブジェクトを出力するテンプレート メソッドを取得しようとしています。ほとんどすべてが機能しており、g++ がオブジェクトの種類ごとに目的の特殊化を選択できるようにするために、enable_if を実装しました。

事は、オーバーロードされていないオブジェクトでは、非常にうまく機能します。しかし、オーバーロードされたものでは、両方の専門化が g++ の合理的な選択であり、コンパイルする代わりにあいまいなオーバーロード エラーが出力されます。

コードは次のとおりです。

なぜそのようなことが曖昧なのか理解できます。それでも、それをより明確にする方法は考えられません...最初のオーバーロードが選択できない場合にのみ、2番目のオーバーロードが選択されることをコンパイラーに理解させるにはどうすればよいですか?

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

c++ - 基本クラスのメンバーを再帰的に再表示します

関数のタプルを引数として取り、関数のoperator()すべてargument_typeのsに対してオーバーロードするクラスを作成しようとしています。現在、これは次のようになります。

問題は、基本クラスがの各再帰的定義を隠していることですoperator()。ですべての定義を再帰的に再表示することは可能ですか、それともテンプレートを作成して適切なオーバーロードを選択usingする唯一の方法ですか?operator()boost::mpl

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

c++ - テンプレート関数への引数は、暗黙的な変換を行っていません

奇妙な理由で、この 1 つのコードでテンプレート引数を取得して、互換性のある型に暗黙的にキャストすることができません。

次の場合に失敗します。

したがって、私が正しければ、コンパイラメイン関数のコードを次のように認識します。

  • ((a + b) + c)
  • 計算するa + b
  • の変換演算子を使用してa + bfromの結果をadd<...>to にキャストするvec<float, 2>add<...>
  • 計算する(a + b) + c

しかし、暗黙のキャストは決して行いません。(a + b) の結果を vec に明示的にキャストすると、コードは正常に動作します。

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

c++ - 可変引数を持つ c++ テンプレート関数

さまざまなタイプの可変数の入力変数を取る C++ テンプレート関数を作成することは可能ですか (入力数は 10 までに制限できます)。たとえばsql_exec()、SQL クエリ文字列を実行し、結果の行を指定された型の std ベクトルに保存する関数を考えます。

今、私の素朴なアプローチは(最大2つのベクトルに制限されています)

もちろん、デフォルトの引数について関数に伝えなかったので、それはばかげています。

しかし、実際には gcc と でコンパイルされます-std=c++0x。ただし、明らかにsql_query()可変長の入力は受け入れられず、2 つのベクトルで呼び出す必要があります。また、現在のほとんどのコンパイラで動作する移植可能なものが欲しいです。私が見落とした明らかなことはありますか?デザインを変更しboost::tupleたり、何か他のものを使用したりできることはわかっていますが、そのようなシンプルなインターフェイスが好きだったでしょう。

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

c++ - コンパイラがメタプログラムで何をするかを判断する方法は? (boost.proto 用)

コンパイラ (g++) がテンプレート コードで何を行っているかを確認するにはどうすればよいですか?

コンパイル時にいくつかの数式を評価するために、boost.proto (式テンプレート ライブラリ) を使用しています。コードは式を正しく評価しますが、コンパイラが式を手書きの C コードと同等のものに拡張したかどうか (つまり、すべての一時変数を削除したかどうか)、またはコンパイル時の最適化がまだ残っているかどうかを確認したいと思います。行われなければ。

コンパイラがテンプレートに対して行ったことを確認する方法はありますか?

ありがとう

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

c++ - C++ テンプレート: 型がサブクラス化に適しているかどうかを判断する方法

type に応じてテンプレート化されたクラスがあるとしましょうT。 、、または; T_ 、参照、または cv 修飾されたものであってはなりません。いくつかの最適化のために、サブクラス化できるかどうかを知る必要があります。したがって、基本的な特性の論理的な組み合わせとして、またはいくつかの SFINAE トリックによって決定される特性タイプが必要です。intint*pair <int, int>struct lolvoidTis_subclassable

元の例では、intとはサブクラス化できませんが、とint*はサブクラス化できません。pair <int, int>struct lol

EDIT : litb が以下で指摘したように、共用体もサブクラス化Tできず、共用体型にすることもできます。

必要な特性タイプをどのように記述すればよいですか?

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

c++ - イテレータから const_iterator を取得する

重複の可能性:
iterator から const_iterator を取得する

const_iteratorから対応するものを返すメタ関数を書きたいiterator

  • get_const_iterator<int*>::typeでなければなりませんconst int*
  • get_const_iterator<const int*>::typeでなければなりませんconst int*
  • get_const_iterator<int* const>::typeconst int*またはである必要がありますconst int* const。気にしません
  • get_const_iterator<std::list<char>::iterator>::typeでなければなりませんstd::list<char>::const_iterator

これは、iterator_traitsそれらの有無にかかわらず行うことができますか?

編集:iterator 2つのコンテナが同じタイプである場合、それらもであると仮定しましょうconst_iterator。理論的には完全に正しいとは言えませんが、これは合理的な仮定だと思います。

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

c++ - 特殊化関数テンプレートの結果

私はテンプレートメタプログラミングにかなり慣れていないので、このアプローチで私の思考エラーを見つけることができません:

ResultTypeRowCount は、ReturnType という名前の public typedef を実装します。

読んでくれてありがとう

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

c++ - 多重継承を持つ別のクラスの一部であるクラスの C++ でのポインターの取得

互いに継承するクラスがいくつかありますが、テンプレートを使用して継承しています。私が望むのは、テンプレートに依存する他の可能な派生クラスの1つであるかのように、基本クラスの1つへのポインターおよび/または参照を効果的に取得することです

派生クラスは、クラス a1 またはクラス b1 から継承できます。これは主に、派生のスペースを節約するためです。これは、b1 が空のクラスであるため、派生がテンプレート パラメーター b1 でインスタンス化されている場合、データ メンバーと仮想関数の余分な負荷がかからないためです。 a1の。

ただし、実際には派生型 (b1) のポインターまたは参照である派生 (a1) からポインターまたは参照を取得したいと考えています。

私が本当に求めているのは、offsetof() を実行する「良い」方法のヘルプですが、offsetof() a2 を取得できる継承を使用しています。これは、派生 (b1) の適切なポインターであると想定しています。空白のクラス。

私は派生(a1)オブジェクトのポインタを取得しようとしましたが、これが正しい位置になることを期待してsizeof(a1)を追加しましたが、他の誰かがより良い方法の提案を持っているかどうか知りたいと思っていました.