問題タブ [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.
ocaml - C ++テンプレートメタプログラミングと同様に、OCamlでコンパイル時の実行を行うことは可能ですか?
C ++では、再帰的なテンプレートとテンプレートパラメーターとしての定数値により、階乗などのコード生成とコンパイル時の実行の興味深い例を実行できます。
パラメトリックポリモーフィズム、ファンクター、または他の概念を使用して、OCamlで同様のことを行うことは可能ですか?
c++ - コンパイル時に 2 つの型をマップする
1 対 1 の関係に関連する一連の型があります。たとえば、次のようになります。
私はコンパイル時にこれらの関係を知っています。
次に、この 2 つの型に依存するテンプレート クラスがあります。
さて、私のライブラリのユーザーは次のように入力します:
2 つの型の間に依存関係があり、ユーザーが最初の型のみを指定するだけで十分であるため、これは不便です。
また、2 つのタイプを混在させることはできません。
私はテンプレート メタ プログラミングにあまり詳しくありません。これは実行可能なタスクであるという印象を受けましたが、間違っている可能性があります。
関連する型の数は膨大ですが、必要に応じてスクリプトを実行してコードを生成できます。
それが可能か、それとも私が時間を無駄にしているのか知っていますか? 私を正しい方向に向けるアイデアはありますか?
c++ - コンパイル時の typedef の検出 (テンプレート メタプログラミング)
現在、テンプレートのメタプログラミングを行っています。私の場合、「反復可能な」型、つまり atypedef foo const_iterator
が同じ方法で存在する型を処理できます。これに新しい C++11 テンプレート メタプログラミングを使用しようとしましたが、特定の型が欠落しているかどうかを検出する方法が見つかりませんでした。
他の特性に基づいて他のテンプレートの特殊化もオン/オフにする必要があるため、現在 2 つのパラメーターを持つテンプレートを使用しており、2 つ目のパラメーターはstd::enable_if
. これが私が現在行っていることです:
exists
ヘルパー テンプレートがないと、このようなことはできませんでした。たとえば、単純に
この特殊化を使用する必要がある場合に、無効なデフォルトのケースが代わりにインスタンス化されたため、機能しませんでした。
ただしexists
、新しい C++11 標準のどこにもこれを見つけることができませんでしboost::type_traits
た。ただし、ホームページでboost::type_traits
は、代わりに使用できるものへの参照は表示されません。
この機能が欠けているのでしょうか、それとも、目的の動作を達成するための他の明白な方法を見落としていましたか?
c++ - C++ テンプレート メタプログラミングの特殊化のあいまいさ
だから私はテンプレートのメタプログラミングを始めたばかりで、文字列クラスを書いています。テンプレート関連の問題があまりなく、ToString、Concat、CharAt、Length を実装しました。次のように Substring を実装しようとしていました。
コンパイルすると、あいまいなエラーが発生します。
私は少し混乱しています。テンプレートの特殊化の要点は、このようなことを行うことだと思いました。これは、次のようなものの単なる拡張ではないのはなぜですか。
このあいまいさを修正するにはどうすればよいですか?
ありがとう。
c++ - 引数のない可変個引数テンプレートのあいまいなオーバーロード
関連している:
次の可変個引数テンプレートのペアを検討してください。
これは機能し、コンパイルされます。しかし、最初のテンプレート パラメータなしでどのように記述すればよいでしょうか。
些細なことに聞こえますか?まあ、それは私が思ったことです。:-) いくつかのアイデアを考えてみましょう。
アイデア #1:
うまくいかない...これを試みたとき、私は専門化を念頭に置いていましたが、2番目の考えでは、それがどのように機能するかではありません。
元の例では、オーバーロードの 2 つの異なるテンプレートを作成しました。最初は 1 つのテンプレート パラメーターを取り、2 つ目は 2 つ以上を取ります。あいまいさも専門性も関係ありません。私はそれを正しく理解していますか?
アイデア #2:
空であることは非テンプレート関数の呼び出しに展開されないため、明らかに機能All<rest...>
しません。rest...
アイデア #3:
ソリューションを少し再構築しましょう。
All(c) はあいまいになるため、これは使用できません。したがって、引数が 0 の場合と引数が 0 より大きい場合が必要です... または、引数が 1 の場合と引数が 1 より大きい場合はどうでしょうか。
アイデア #3.5:
うん、動作しますが、コピーパスタが含まれています (この場合は単純ですが、より大きくなる可能性があります!)。ちょうど別の回避策。
アイデア #4:
#1 を試してみましょう。ただし、関数の代わりにクラスを使用します。
クラスを専門化できるので、これは有望に見えます。でもねえ、それは何ですか?
申し訳ありませんが、実装されていません: 'rest ...' を固定長の引数リストに展開することはできません
これは GCC 4.4 のものではありませんか? 私は MinGW GCC 4.6.1 (tdm-1) を使用しています。
とにかく、そんな初歩的なことを素直にできないと思っていいのだろうか。このタスクを実行するには、ダミー テンプレート パラメータを追加して回避策を使用する必要がありますか?
または、ゼロ引数のケースを指定するための単純で正しいバリアントがありますか?
c++ - コンパイル時に、2つのタイプに共通する継承ツリーのルート(存在する場合)を推測するにはどうすればよいですか?
2つのタイプ(1つまたは0の基本クラスを持つ)の共通の祖先が存在する場合、それを検出する必要があるという問題があります。この問題を解決するために型特性を構築することは可能ですか?コード内:
次のタイプが与えられます:
closest_common_ancestor
次のタイプになります。
型に基本クラスが0か1か、もしそうならその型の名前を調べることができれば、この問題を解決できると思います。これは可能ですか?
c++ - コンパイル時に型がstd::vector :: iteratorであるかどうかを確認するにはどうすればよいですか?
std::vector::iterator
コンパイル時など、特定の型が既知のネストされた型のインスタンスであるかどうかを検出する必要があるという問題があります。タイプ特性を作成したいis_std_vector_iterator
:
しかし、コンパイラエラーが発生します。
のような依存型をチェックすることは可能std::vector<T,Allocator>::iterator
ですか?
このような特性のやる気を起こさせるユースケースは次のとおりです。
c++ - mplベクトルの最初のM要素を取得する
私は要素を持っています、例えばboost::mpl::vector
:N
M
の最初の要素を含むシーケンスを取得したいと思いmy_vector
ます。したがって、M
2の場合、次のようにします。
最初は使用することを考えましたが、とのerase<s,first,last>
適切なテンプレートパラメータを見つけることができませんでした。(使用していました。)しかし、タスクにも使用できるのも私の理解です。これを行うための最良の方法は何ですか?first
last
at_c<...>::type
filter_view
c++ - タイプがC++で派生できるかどうかの検出
次のテンプレートクラスとそのタイプの(グローバル)変数があります。
int
から派生できないため、コンパイルエラーが発生することが予想されますが、これはVisual C++2010では正常にコンパイルされます。
ポインタを削除すると、予期されるコンパイルエラーが発生します(intはから派生できません):
このクラスをSFINAEテストに使用して、指定されたタイプが次から派生できるクラスであるかどうかをテストしたいと思いました。
int
ただし、これは、上記の理由などのプリミティブ型の場合でも、常にtrueを報告します。これはC++の予想される/有効な動作ですか?
c++ - シンタックス シュガー: シンプルな関数オブジェクトを自動的に作成する
クラス テンプレートのセットと 2 つの特殊変数を実装する必要が_1
あり_2
ます。
彼らは、次の法規を制定する必要があります。
_1 * 5 も _1 / 5 などと同様に単項関数を生成する必要があると思います。
- ブースト不可
- ラムダは許可されていません
現在、私はテンプレートとテンプレート メタプログラミングの経験がほとんどないため、どこから始めればよいか、クラス テンプレートの構造がどのように見えるべきかさえわかりません。operator=
クラステンプレート内operator>>
でこれらすべての実装を個別に記述する必要があるかどうか、またはより一般的な方法があるoperator+
かどうかがわからないため、特に混乱しています。...-
...*
.../
これらの演算子の実装例を示した回答に特に感謝します。テンプレートはまだ私にはとても混乱しているように思えます。