【问题标题】:Throwing function-like variadic macro wrapping, replacing thrown exception抛出类似函数的可变参数宏包装,替换抛出的异常
【发布时间】:2013-10-14 20:34:29
【问题描述】:

假设我有一个第三方库,它提供了一个类似函数的 ThirdPartyMacro 宏,即:

  1. 可变参数并接受任意标记,而不仅仅是格式良好的 C++ 表达式。解析参数后,ThirdPartyMacro 会提取一些标记,这些标记假定为标识符,表示其调用范围内的变量,并按原样使用它们。
  2. 计算为已知类型的某个值。
  3. 可能会抛出ThirdPartyException 类型的异常

我想通过编写一个宏 MyMacro 来结束这一切,它的行为与 ThirdPartyMacro 完全相同,但只要 ThirdPartyMacro 会抛出 ThirdPartyException,就会抛出 MyException

有可能吗?如果有,怎么做?

不是因为 (1) MyMacro 不能是函数,因为它的参数不能作为函数参数传递。

【问题讨论】:

    标签: c++ c++11 macros wrapper


    【解决方案1】:

    lambda 会有所帮助:

    #define MyMacro(...) \
       [&]{ try { return ThirdPartyMacro(__VA_ARGS__); } \
            catch( const ThirdPartyException& e ) \
            { throw MyException( e.what() ); } }()
    

    【讨论】:

    • 这在我(下)指定的约束内有效。让我限制他们。在解析了参数ThirdPartyMacro 之后,提取了一些标记,这些标记假定为表示其调用范围内的变量的标识符,并按原样使用它们。这需要在 lambda 中捕获它们,而这不会。
    • @yurikilochek 所以,抓住他们?还是有更多限制为什么[&](或[=])不起作用?在某些情况下,您可能还需要标记 lambda mutable,尝试适合您的方法。
    • 所述变量的列表显然取决于宏的参数,所以我不能对它们进行硬编码。但是我不能明确地将它们传递给宏,因为这会引入将它们与实际宏输入分开的问题,并且无论如何都会改变语义。
    • 不屑一顾,我忘记了“全部捕获”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2014-11-03
    • 2015-06-04
    • 2013-11-18
    • 2015-08-26
    相关资源
    最近更新 更多