假设我有一个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 ++。
答案 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 */ }