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

c++ - それ自体がテンプレートである専門化

私はいくつかの専門分野を持つテンプレート クラスを持っています。
しかし、次の特化はテンプレートそのものです。これをどのように指定しますか:

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

c++ - constexpr ではなく、特殊なテンプレート構造体で type_traits が実装されるのはなぜですか?

struct標準が単純な boolean ではなくtemplate として指定する理由はありますconstexprか?

enable_if主な質問に対する適切な回答でおそらく回答される追加の質問では、非構造体バージョンをどのように処理しますか?

0 投票する
6 に答える
1703 参照

c++ - 型が const 参照のみで呼び出し可能かどうかを判断するにはどうすればよいですか?

型 F が形式の関数呼び出し演算子を持っている場合にのみ、beis_callable<F, Arg>と定義する C++ メタ関数を書きたいと思います。たとえば、次の場合valuetrueSomeReturnType operator()(const Arg &)

私はなりたいとis_callable<foo, int &>思います。これは私がこれまでに持っているものです:falseis_callable<foo, const int &>true

これは1andを出力しますが、 andのみが定義されているため、 and1が必要です。01foovoid operator()(const int &)

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

c++ - 後でマクロで呼び出す関数のリストを収集する

私は、C++ の列挙型を簡単にするための小さなライブラリを作成しています。構文は次のようなものです。

このマクロは、たとえば次のアクセスを許可するクラス MyEnum を作成します。

追加のデータ (文字列など) を列挙値に格納するなど、さらにいくつかの機能があります。

マクロは完成して機能しますが、上記のように定義するのは簡単ではありません。このためには、後で呼び出すことができる ENUM_VAL マクロを使用して初期化関数のリストを作成する方法が必要です。次の boost::mpl アプローチのようなもの:

このように list##(__COUNTER__-1) は最後に Init##Name 型を含み、最後に mpl foreach を使用してすべての格納された型で init() を呼び出すことができます。

今の問題はネーミングです。マクロのインスタンス化ごとに __COUNTER__ を 2 回使用する必要があり、これによりカウンターが 2 回インクリメントされます。さっき検索して知った

  • C プリプロセッサは、変数に名前を付けるときに (__COUNTER__-1) を計算しません
  • インクリメントせずに __COUNTER__ を読み取る方法はありません。

そのため、後で呼び出すことができる関数のリストを収集する別の方法が必要です。

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

c++ - テンプレートのメタプログラミングでオーバーロード解決を実行する

別の質問に触発されて、その関数を呼び出すために使用される実際の引数を指定して、オーバーロード メンバー関数の型を推測する方法を見つけようとしました。これが私がこれまでに持っているものです:

テンプレート パラメーター Arg が実際の型と一致する限り、static_cast は成功しますが、これはオーバーロード解決 (完全一致) の最も単純なケースにすぎません。テンプレートのメタプログラミングで完全なオーバーロード解決プロセスを実行することは可能ですか?

これは純粋に仮説であり、実際の使用を意図したものではありません。

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

c++ - 階乗の意味テンプレート定義で

次のテンプレート定義とテンプレート特殊化定義がどのように機能するかを理解するのが難しいですか? 私には、factorial<34>またはfactorial<T-1>奇妙に見える!

例えば:

どういう意味ですか?

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

c++ - このhas_memberクラステンプレートはどのように機能しますか?

次のクラステンプレート(ここから取得)がどのように機能するかを理解しようとしていますが、正しく理解できませんでした。

具体的には、その目的BaseMixinや存在がわかりませんoperator()。また、Baseそれから派生しているので、私もわかりません。

さらに具体的には、テンプレートパラメータTypeが定義されている場合operator()、なぜSFINAEがトリガーされ、最初のdeduce()関数が無視され、2番目の関数が選択されるのでしょうか。


とにかく、これは私のテストコードです:

Output(ideone):

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

c++ - C++11 可変個引数テンプレート テンプレート パラメーター

古い質問を保持します。解決策については、以下を参照してください。それはおそらく単純なことですが、それでもです。次の C++11 コード フラグメントがあります。

の各タイプでEventStorage継承テンプレートを作成するにはどうすればよいですか。私は Loki:: ライブラリでそれを行うことができましたが、可変個引数テンプレートで C++11 を使用したいと考えています。ありがとうございました。EventContainertypelist

EventStorage解決策 1:テンプレート テンプレートの問題を修正します。これにより、 の各タイプでテンプレート化されたEventStorageすべてが複数継承されます。EventContainerTs

今、私は次のコンパイル時エラーがありますmain():

コンパイラが混乱するのはなぜですか? やはり特定の型で押します。GCC 4.6.1 はこちら。

解決策 2: @Matthieu M. が提案したように、転送メソッド int を提示できますEventStorageが、追加の関数呼び出しが 1 つ必要です。

Alexandrescu によると、パラメーターが参照である限り、コンパイラーはこの前方呼び出しを最適化します。これで、質問は正式に終了しました:)

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

c++ - コピーせずに、融合ベクトルの std ベクトルから列を返す

std::vectorすべての要素が で表される「テーブル」がありboost::fusion::vectorます。std::vector値をコピーせずに、このテーブルの「列」の表現を として返す必要があります。これを行う最善の方法は何ですか?n が列番号である nviewsを構築しようとしてstd::vectorいますが、機能していないようです。私は正しい軌道に乗っていますか、それとも他の方法がありますか?

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

c++ - ユーザー定義の Boost.MPL アルゴリズムに二項述語をどのように渡す必要がありますか?

Boost.MPL スタイルのメタプログラミング バージョンでの次の試みを検討してください。std::any_of

1 1 1 1 1 1 1 0. つまり、述語として渡されたall_ofwithの最後の呼び出しstd::is_base_ofは false を生成します。これが機能しないのはなぜですか?どうやら、基本クラスBは述語に適切にバインドされていません。二項述語を渡すにはどうすればよいですか? mpl::lambda または mpl::bind のいくつかの組み合わせ?

アップデート

Luc Touraille の優れた回答に基づいて、これが私の質問に対するラムダフリーのソリューションです。追加のボーナスとして、コンパイル時のバージョンnone_ofany_of