【问题标题】:How to keep original function return value after using Variadic Macros?使用可变参数宏后如何保持原始函数返回值?
【发布时间】:2020-12-17 14:44:03
【问题描述】:

这是一个 VS2010 C++ 项目。我有一个 API 列表:

  1. int a = API1("para1", "para2", ...);

  2. double a = API2("para1", "para2", ...);

  3. float a = API3("para1", "para2", ...);

现在,我需要添加一个新的 API,APINEW()。只要运行上述 API,APINEW 就需要按如下方式调用。因此,我决定使用 Variadic Macros,如下所示:

#define newAPI1(...) ( API1(__VA_ARGS__); APINEW() )

#define newAPI2(...) ( API2(__VA_ARGS__); APINEW() )

#define newAPI3(...) ( API3(__VA_ARGS__); APINEW() )

但是,我无法从我的 API1、API2 和 API3 正确获取返回值。

我正在尝试使用以下代码,因为我知道 marco 将始终返回最后一项,但它无法通过编译。

#define newAPI1(...) ( {auto a = API1(__VA_ARGS__); APINEW(); a} )

我想知道有没有一种方法可以使它正确? (我使用新名称(例如newAPI1)的原因是为了避免冲突,因为在项目中,它可能有其他宏会重载现有的API1、API2和API3。)

另一个问题: 有没有办法通过组合

  1. __VA_ARGS__的第一个参数
  2. __FUNCTION__
  3. __LINE__

进入 APINEW 参数 => APINEW(first parameter of __VA_ARGS__ + __FUNCTION__ + __LINE__)

【问题讨论】:

    标签: c++ c++11 macros c-preprocessor variadic-macros


    【解决方案1】:

    也许是这样的。

    template <typename FirstArg, typename... Args>
    auto API1Helper(const char* file, int line, FirstArg&& first_arg, Args&&... args) {
      auto ret = API1(first_arg, std::forward<Args>(args)...);
      APINEW(first_arg, file, line);
      return ret;
    }
    
    #define newAPI1(...) API1Helper(__FILE__, __LINE__, __VA_ARGS__)
    

    虽然这可能需要比 VS2010 更新的编译器。

    【讨论】:

    • 感谢您的回答。我已经尝试过,它在 vs2015 中有效,但在 vs2010 中失败了。不知道有没有其他适合vs2010的方式?
    • vs2010 是否支持可变参数模板?例如。这会编译template &lt;typename... Args&gt; void f(Args&amp;&amp;... args) {}
    • 答案是否定的。 VS2010 不支持这种格式的模板。
    • 嗯,我想你知道API1 的签名。与其将API1Helper 设为模板,不如将其设为与API1 参数匹配的普通函数,以及fileline
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2014-06-07
    • 2021-09-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多