2009-07-05 6 views
0

catchステートメントを置き換えるC++マクロCATCHがあり、そのマクロがパラメータとして変数宣言の正規表現(<type_name> [*] <var_name>など)を受け取るとします。それらの「フィールド」を認識してマクロ定義で使用する方法はありますか?例えばマクロの引数を正規表現として扱うことはできますか?

#define CATCH(var_declaration) <var_type> <var_name> = (<var_type>) exception_object; 

は同じように動作します:疑問として、私はグラムを使用してい

#define CATCH(var_type, var_name) var_type var_name = (var_type) exception_object; 

++。

答えて

1

あなただけのマクロでそれを行うことはできませんが、あなたには、いくつかのヘルパーコードで巧妙なことができます。このような何かを試してみてください。これらの定義、

CATCH(フー・EX)で

template<typename ExceptionObjectType> 
struct ExceptionObjectWrapper { 
    ExceptionObjectType& m_unwrapped; 

ExceptionObjectWrapper(ExceptionObjectType& unwrapped) 
: m_unwrapped(unwrapped) {} 

template<typename CastType> 
operator CastType() { return (CastType)m_wrapped; } 
}; 
template<typename T> 
ExceptionObjectWrapper<T> make_execption_obj_wrapper(T& eobj) { 
    return ExceptionObjectWrapper<T>(eobj); 
} 

#define CATCH(var_decl) var_decl = make_exception_obj_wrapper(exception_object); 

が必要です。私は怠惰にこれをテストしないことを認めます(私の防衛では、あなたの例外オブジェクトテストはありません)。 exception_objectが1つの型だけである場合、ExceptionObjectTypeテンプレート・パラメーターを取り除くことができます。さらに、例外オブジェクト自体にキャスト演算子を定義できる場合は、ラッパーを完全に削除することができます。私は推測してexception_object実際にはvoid *または何かとあなたのキャストポインタです。

0

どのコンパイラを使用していますか?私はこれをgccプリプロセッサでは見たことがありませんが、そこにプリプロセッサがないとこの機能を実装することはできません。あなたはしかし、うーん。

+0

私が使用しているコンパイラはg ++です。別のプリプロセッサを使っても構いません。 – freitass

0

でプリプロセッサのキックの前に話をするので、あなたのprepreprocessingを行うにはsedのようなものを通して、あなたのスクリプトを実行されて何ができるか

...私は推測しているが、なぜあなたはしないでください:)


#define CATCH(varType,varName) catch(varType& varName) { /* some code here */ } 

+0

私はデフォルトの構成を使用することができないので、そのためのマクロを書いています。 – freitass

関連する問題