是否可以将宏的参数视为正则表达式?

时间:2009-07-05 22:30:49

标签: c++ regex macros

假设我有一个C ++宏CATCH来替换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;

如有疑问,我正在使用g ++。

3 个答案:

答案 0 :(得分:1)

你不能只用宏来做,但你可以聪明地使用一些帮助代码。

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);

有了这些定义,

CATCH(Foo ex);

应该工作。我会承认懒惰不测试这个(在我的辩护中,我没有你的异常对象测试)。如果exception_object只能是一种类型,则可以删除ExceptionObjectType模板参数。此外,如果您可以在exception_object本身上定义强制转换运算符,则可以完全删除包装器。我猜是exception_object实际上是一个void *或者其他东西和你的铸造指针。

答案 1 :(得分:0)

您使用的是什么编译器?我从未在gcc预处理器中看到过这种情况,但我不能肯定地说没有预处理器可以实现这个功能。

然而,你可以做的是通过像sed之类的东西运行你的脚本进行预处理,以便在预处理器启动之前说出来。

答案 2 :(得分:0)

嗯......我只是猜测,但你为什么不尝试这样的事情::)


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