問題タブ [boost-preprocessor]
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++ - Boostforeachに基づくenumerate_foreachの実装
この質問の前置きとして、私はさまざまなC ++ユーティリティ関数と(必要な場合は)マクロを、自分で使用するためのより大きなツールキットに実装してきました。最近、BOOST_FOREACHと反復可能な意識関数に基づいてさまざまなループマクロを作成していました。
簡単に言うと、BOOST_FOREACHを使用する列挙ループを作成するのに苦労しましたが、ループの反復ごとにインクリメントされる追加のパラメーターが渡されました。これは、多くのボイラープレートコードを追加せずに任意のイテレーターをループするときに役立つPythonのenumerateコマンドのように機能します。マクロはBOOST_FOREACHのような形式を取ります。
そしてこれを効果的に行いますが、不均衡な'}'を配置して閉じる(または他のループ終了マクロ)ことに依存することはありません:
C++で非C++演算子を作成しようとしているという非難を受ける前に、これが外国の概念をC ++に詰め込んでいることを十分に認識しており、PythonizeC++コードを試していません。極端な依存関係なしに、既知のツールセット/ブーストを使用してこのようなループをクリーンに実装できるかどうか、私は単に興味があります。このようなマクロ定義があると、反復するときにカウントする必要がある特定のスタイルのループのバグの原因となる可能性がなくなり、COUNT変数の目的が明確になります。
BOOST_FOREACHに入る前にCOL変数でテンプレートラッパーを実行することを考えましたが、COLの可能性の数は、異なるバージョンのENUMERATE_FOREACHを作成し、多くのBOOST_FOREACHを再実装せずに、反復可能な変数のいくつかの組み合わせでそれを困難/不可能にします- -膨大なテスト/時間のない、困難でばかげた価値のあるタスク。
別のインライン関数を実行することは機能する可能性がありますが、ループの構文が壊れて、(すでに実装した)各スタイルの演算子関数の受け渡しの状況になります。
これにより、boostのライブラリからforeach.hppの最後の行を取得し、追加の引数に独自のインクリメント演算子を挿入することになりました。次に、ブーストバージョンに依存するようになり、ハッキーなカスタムマクロの破壊をブーストするための新しい更新(構文の変更)について心配します。
私が考えた最後のオプションは、ENUMERATE_BEGINとENUMERATE_ENDを実行して、イテレーターのインクリメント操作を非表示にすることです。このアプローチは、ユーザーが1つではなく2つのマクロを配置する必要があるため、単一のマクロよりもエラーが発生しやすくなります。ただし、これが唯一の単純な解決策である可能性があります。
私はSOや他の情報源を調べて、誰かが以前にこれを試したことがあるかどうかを確認しました。うまくいけば、誰かがそのような実装の概念をうまく試したか、私のアプローチを変えることについてのアイデアを持っています。これを行うためのクリーンな方法がない場合は、カウントしたいときにcount++でループを開始し続けることができます。繰り返しになりますが、これは好奇心であり、誰かが私が口論したアイデアの1つは、完全に合理的なアプローチであるか、それが得られる限り優れていると提案するかもしれません。
c++ - プリプロセッサを使用してソース ファイルからテキスト行を取得するには?
ファイルと、その内容を出力したい行 ( __file__
, ) があります。__line__
そのようなことはプリプロセッサを介して可能ですか?
c++ - 関数を繰り返し呼び出さないようにする
私は次のように非常に単純なクラス定義を持っています:
ここでどちらか
また
すべてのメンバー関数に対して呼び出す必要があります。クラスのメンバー関数ポインタを取り、文字列でマップするので、後で関数を文字列で識別できます。
すべてが正常に機能していますが、クラス構造が大きくなると、プログラマーはすべてのメンバー関数に対してこの関数を繰り返し呼び出す必要があります。とにかくプリプロセッサ、またはブーストウェーブなどの前処理ライブラリを使用して、プログラマーがこれらの繰り返しの呼び出しを行う必要がないようにすることはできますか?
編集:混乱して申し訳ありませんが、私は明らかにここで問題を十分に説明していませんでした。文字列をメンバー関数ポインタにマッピングしています。
m_urlRulesは文字列をキーとするstd::mapであり、メンバー関数ポインターを値としてregControllerは基本的にm_urlRulesのセッター関数であるため、両方のステートメントは事実上同じことを行い、文字列をメンバー関数にマップします。
REG_NAMEは、非常に醜い型キャストを置き換えるマクロです。
私がやろうとしているのは、クラスが次の構造を持つ場合、
コンストラクターで次のことを行う必要はありません。
c++ - Boost は正当な C++ 前処理ディレクティブ構文を使用していますか?
私の (比較的古い) C++ コンパイラは、Boost でこのファイルを詰まらせました。
これは本当に正当な C++ ですか? プリプロセッサ トークンの構文に関する規則は何ですか?
c++ - セッターとゲッターのみを定義して提供することでフィールドを非表示にする方法は?
不動産フィールドを非表示にして (プライベートまたはパブリックにするのではなく、セッターとゲッターの使用を強制する)、単純なセッターとゲッターを提供する方法を知りたいです。だから私はどのようにAPIを作成するのだろうか:
Boostプリプロセッサを介してそのようなものを作成する方法は?
c++ - 任意のタイプの任意の数の値を1つの文字列に結合する簡単なコマンド
次のコードを検討してください。
これは、<<で始まるすべての値を文字列内で非常にうまく組み合わせます。コードの重複が少なく、短くて使いやすいバージョンを見つけたいと思います。さらに、上記のコードは単なる例であり、コマンドは変数と文字列の任意の組み合わせを受け入れる必要があります。理想的には次のようなものです。
これは、Boost.Preprocessor、インライン関数、およびすべてのトリックを使用しても、C++で移植可能な方法で可能ですか。
c++ - Boost.Preprocessor を使用してこのコードの繰り返しを減らす
次のコードを検討してください。
等...
私はこれを15個の引数のようなものまで必要とします。
Boost.Preprocessor を使用してこの繰り返しを単純化できるかどうか、またどのようにそれを行うかを考えています。ドキュメントを見ましたが、かなり混乱しています。
c++ - プリプロセッサ配列の生成
関数定義を置き換えるマクロを作成しようとしています。このマクロは、関数の名前を配列に登録して、他のマクロが配列の要素で何かを実行できるようにする必要があります。
新しい関数を追加するたびにリストを編集することなく、コンソールで使用できる関数のリストを作成したいと思います (実際には複数のリストです)。
少し読んだ後、ブーストプリプロセッサを調べました。残念ながら、新しい配列を「保存」する方法はないようです。私がやりたいことは次のようなものです:
残念ながら、私の知る限り、redefine は存在せず、#define はマクロでは使用できません (間違っていたら訂正してください)。
ブーストのプリコンパイラのSLOTを見てみましたが、一度設定した変数も変更できないと思います。
独自のプリプロセッサを作成する以外にこれを行う方法はありますか? そうではありませんか?(Code::Blocks で MinGW を使用する)。
c++ - 定義を BOOST_PP_TUPLE または BOOST_PP_SEQ に変換する
またはに変換でき#define Name Alex
ますBOOST_PP_SEQ like (A)(l)(e)(x)
かBOOST_PP_TUPLE (A,l,e,x)
? そして、私にとってより便利です('A')('l')('e')('x')
または('A','l','e','x')
それぞれ?
c++ - プロキシクラスを作成するには?
N
パブリック データ フィールドがなく、メソッドのみ (重複しない) の異なるクラスがある場合、ブースト プリプロセッサを介してすべてのプロキシ クラスを統合する方法を作成するには?
たとえば、クラスがありました。 A には method がdo();
あり、クラス B には method がありdata();
ました。A と B のすべてのメソッドを持つプロキシ クラスを作成する方法 (たとえば、Boost Preprocessor を使用) があるかどうか (ここではdo()
data()
) と、そのクラス インスタンスへのポインターを取り込むコンストラクター (A 用と B 用) があるかどうか疑問に思います。 ?
したがって、次のような疑似コードのような API を取得します。
boost::preprovcessor を使用して C++11 でそのようなものを作成することは可能ですか、それともすでにブーストされている可能性がありますか?
また、外部ジェネレーターを使用してそのようなことが可能であれば、それは私にとっては問題ありません。