1

私はこのようなマクロを持っています (これは実際の便利なユースケースから来ていますが、単純化されたケースで遊んでいます):

#define MY_MACRO(M)  M(3) M(5) M(7)
#define MULTIPLY_BY_2(A)  (2*A)

私はそれから書くことができます

MY_MACRO(MULTIPLY_BY_2)
// -> (2*3) (2*5) (2*7)

涼しい!私が欲しいのはこれです:

#define MULTIPLY(A,B) (A*B)
MY_MACRO(BIND(MULTIPLY, 2))

上記と同じ結果を得るには。BIND とは? 私はいくつかのハックを試しましたが、これはほぼ可能であると報告できます (これは驚くべきことです)。しかし、それはきれいではなく、一般的でもありません。これはうまくできますか?(つまり、純粋に CPP でいくつかの実際の機能的な機能を構築しますか?) バインドされたマクロをバインドするのに十分に実行できますか?

おそらく、私が本当に求めているのは、あなたが知っているプリプロセッサ ライブラリにこのようなツールがあるかどうかということです。Boost では、このようなものはまったく見つかりませんでした。

4

4 に答える 4

4

マクロ プログラミングにきれいを要求することはできません。申し訳ありません。

于 2012-04-20T23:02:12.737 に答える
2

アンバランスな括弧は一種のバインド操作を行うことができますが、呼び出し構文は通常のマクロとは異なります。特別な閉じ括弧が必要です。

#define BIND( op, arg ) op ( arg,
#define MULTIPLY( a, b ) ( (a) * (b) )

#define MULTIPLY_BY_2 BIND( MULTIPLY, 2 )

MULTIPLY_BY_2( 5 )) // note two close parens

http://ideone.com/EQvs2

必要に応じて閉じ括弧を生成するマクロをさらに定義してみることができますが、おそらくもっと良い解決策があります。

于 2012-04-21T08:25:09.560 に答える
1

実はそうです。Order ライブラリでは、上記を次のように表現できます。

#include <order/interpreter.h>

#define ORDER_PP_DEF_8my_mac ORDER_PP_FN( \
8fn(8M, 8seq(8ap(8M, 3), 8ap(8M, 5), 8ap(8M, 7))) )

#define ORDER_PP_DEF_8bind ORDER_PP_FN( \
8fn(8F, 8A, 8fn(8X, 8ap(8F, 8A, 8X)) ) )

#define ORDER_PP_DEF_8multiply ORDER_PP_FN( \
8fn(8L, 8R, 8times(8L, 8R)) )      // (already built-in as 8times)

ORDER_PP (
    8my_mac(8bind(8multiply, 2))   // -> (6)(10)(14)
)

bindそれはandの手動定義ですmultiply。Order は ML スタイルの部分評価もネイティブにサポートしているため、次のように記述できます。

ORDER_PP ( 8my_mac(8times(2)) )    // -> (6)(10)(14)

C プリプロセッサによって課せられる少し奇妙な構文は別として、この言語は基本的に、多くの一般的な機能イディオムをサポートするかなり単純な Lisp/ML ハイブリッドです。

于 2015-05-01T05:22:09.623 に答える
1

あなたが達成したい機能の種類を完全に理解しているかどうかはわかりませんが、次の例はあなたの例に合っています:

#define MULTIPLY_2(X) (2*(X))
#define POW_2(X) ((X)*(X))
#define BIND(OP, NUM) OP ## _ ## NUM

for MULTIPLY_2& Co は、引数が必要な評価順序になっていることを確認するために、常に引数を括弧で囲むことに注意してください。また、一般的な戦略の引数が複数回評価される可能性があることにも注意してください。これは、式に副作用が含まれている場合、深刻なバグになる可能性があります。

基本的な操作をインライン関数として使用し、関数呼び出しをマクロで構成することをお勧めします

#define MULTIPLY_2(X) multiply2(X)
#define POW_2(X) pow2(X)
于 2012-04-21T07:47:05.567 に答える