問題タブ [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.
c++ - それ自体がテンプレートである専門化
私はいくつかの専門分野を持つテンプレート クラスを持っています。
しかし、次の特化はテンプレートそのものです。これをどのように指定しますか:
c++ - constexpr ではなく、特殊なテンプレート構造体で type_traits が実装されるのはなぜですか?
struct
標準が単純な boolean ではなくtemplate として指定する理由はありますconstexpr
か?
enable_if
主な質問に対する適切な回答でおそらく回答される追加の質問では、非構造体バージョンをどのように処理しますか?
c++ - 型が const 参照のみで呼び出し可能かどうかを判断するにはどうすればよいですか?
型 F が形式の関数呼び出し演算子を持っている場合にのみ、beis_callable<F, Arg>
と定義する C++ メタ関数を書きたいと思います。たとえば、次の場合value
true
SomeReturnType operator()(const Arg &)
私はなりたいとis_callable<foo, int &>
思います。これは私がこれまでに持っているものです:false
is_callable<foo, const int &>
true
これは1
andを出力しますが、 andのみが定義されているため、 and1
が必要です。0
1
foo
void operator()(const int &)
c++ - 後でマクロで呼び出す関数のリストを収集する
私は、C++ の列挙型を簡単にするための小さなライブラリを作成しています。構文は次のようなものです。
このマクロは、たとえば次のアクセスを許可するクラス MyEnum を作成します。
追加のデータ (文字列など) を列挙値に格納するなど、さらにいくつかの機能があります。
マクロは完成して機能しますが、上記のように定義するのは簡単ではありません。このためには、後で呼び出すことができる ENUM_VAL マクロを使用して初期化関数のリストを作成する方法が必要です。次の boost::mpl アプローチのようなもの:
このように list##(__COUNTER__-1) は最後に Init##Name 型を含み、最後に mpl foreach を使用してすべての格納された型で init() を呼び出すことができます。
今の問題はネーミングです。マクロのインスタンス化ごとに __COUNTER__ を 2 回使用する必要があり、これによりカウンターが 2 回インクリメントされます。さっき検索して知った
- C プリプロセッサは、変数に名前を付けるときに (__COUNTER__-1) を計算しません
- インクリメントせずに __COUNTER__ を読み取る方法はありません。
そのため、後で呼び出すことができる関数のリストを収集する別の方法が必要です。
c++ - テンプレートのメタプログラミングでオーバーロード解決を実行する
別の質問に触発されて、その関数を呼び出すために使用される実際の引数を指定して、オーバーロード メンバー関数の型を推測する方法を見つけようとしました。これが私がこれまでに持っているものです:
テンプレート パラメーター Arg が実際の型と一致する限り、static_cast は成功しますが、これはオーバーロード解決 (完全一致) の最も単純なケースにすぎません。テンプレートのメタプログラミングで完全なオーバーロード解決プロセスを実行することは可能ですか?
これは純粋に仮説であり、実際の使用を意図したものではありません。
c++ - 階乗の意味テンプレート定義で
次のテンプレート定義とテンプレート特殊化定義がどのように機能するかを理解するのが難しいですか? 私には、factorial<34>
またはfactorial<T-1>
奇妙に見える!
例えば:
どういう意味ですか?
c++ - このhas_memberクラステンプレートはどのように機能しますか?
次のクラステンプレート(ここから取得)がどのように機能するかを理解しようとしていますが、正しく理解できませんでした。
具体的には、その目的BaseMixin
や存在がわかりませんoperator()
。また、Base
それから派生しているので、私もわかりません。
さらに具体的には、テンプレートパラメータType
が定義されている場合operator()
、なぜSFINAEがトリガーされ、最初のdeduce()
関数が無視され、2番目の関数が選択されるのでしょうか。
とにかく、これは私のテストコードです:
Output(ideone):
c++ - C++11 可変個引数テンプレート テンプレート パラメーター
古い質問を保持します。解決策については、以下を参照してください。それはおそらく単純なことですが、それでもです。次の C++11 コード フラグメントがあります。
の各タイプでEventStorage
継承テンプレートを作成するにはどうすればよいですか。私は Loki:: ライブラリでそれを行うことができましたが、可変個引数テンプレートで C++11 を使用したいと考えています。ありがとうございました。EventContainer
typelist
EventStorage
解決策 1:テンプレート テンプレートの問題を修正します。これにより、 の各タイプでテンプレート化されたEventStorage
すべてが複数継承されます。EventContainer
Ts
今、私は次のコンパイル時エラーがありますmain()
:
コンパイラが混乱するのはなぜですか? やはり特定の型で押します。GCC 4.6.1 はこちら。
解決策 2: @Matthieu M. が提案したように、転送メソッド int を提示できますEventStorage
が、追加の関数呼び出しが 1 つ必要です。
Alexandrescu によると、パラメーターが参照である限り、コンパイラーはこの前方呼び出しを最適化します。これで、質問は正式に終了しました:)
c++ - コピーせずに、融合ベクトルの std ベクトルから列を返す
std::vector
すべての要素が で表される「テーブル」がありboost::fusion::vector
ます。std::vector
値をコピーせずに、このテーブルの「列」の表現を として返す必要があります。これを行う最善の方法は何ですか?n が列番号である nviewsを構築しようとしてstd::vector
いますが、機能していないようです。私は正しい軌道に乗っていますか、それとも他の方法がありますか?
c++ - ユーザー定義の Boost.MPL アルゴリズムに二項述語をどのように渡す必要がありますか?
Boost.MPL スタイルのメタプログラミング バージョンでの次の試みを検討してください。std::any_of
1 1 1 1 1 1 1 0. つまり、述語として渡されたall_of
withの最後の呼び出しstd::is_base_of
は false を生成します。これが機能しないのはなぜですか?どうやら、基本クラスB
は述語に適切にバインドされていません。二項述語を渡すにはどうすればよいですか? mpl::lambda または mpl::bind のいくつかの組み合わせ?
アップデート
Luc Touraille の優れた回答に基づいて、これが私の質問に対するラムダフリーのソリューションです。追加のボーナスとして、コンパイル時のバージョンnone_of
とany_of