【问题标题】:Is there any way to get the return type of the "current function"有什么方法可以获取“当前函数”的返回类型
【发布时间】:2012-11-08 09:56:59
【问题描述】:

我想编写一个模板,该模板将获取实例化函数的返回类型作为参数。

例如,假设我有一个 Result 模板类:

template<type T>
class Result {
    T _result_value;
    T& operator=( T that );
    ~Result( );
}

这个课程会有几个专业。在析构函数中我想记录返回类型,在operator= 赋值中我想检查并断言错误值。

理想情况下,我希望能够有这样的定义:

#define RESULT Result< /* decltype magic for type of current function */ >

所以我可以使用它:

HFILE MyOpenFile( ... ) {
    RESULT result;
}

...将推导出为Result&lt;HFILE&gt;。这是一个简化的例子:写RESULT而不是Result&lt;HFILE&gt;没什么大不了的,但是还有其他一些场景,当前函数的返回类型不容易获得。

【问题讨论】:

  • 我猜你至少必须将函数名传递给宏(例如RESULT(MyOpenFile)),在重载的情况下,你仍然会遇到歧义。即使getting a pointer to the current function 也很棘手,如果不重新命名函数,似乎不可能获得正确类型的指针。
  • @MvG,您可以通过将函数 + 参数传递给 decltype 来解决过载歧义,例如decltype(foo(b))decltype(foo(a, b)) 将正确解析。但是,这很痛苦..
  • 如果确实存在,则必须限制用户可以使用该信息做什么。递归使用此类信息可能会使函数的返回类型无法确定。

标签: c++ c++11 type-inference


【解决方案1】:

没有。 C++ 中没有任何内容涉及“当前函数”。最接近的是__func__,但这是一个字符串文字。因此,没有什么可以传递给decltype

不是你需要它,auto

【讨论】:

    【解决方案2】:

    这是不可能的,因为内存中没有专门的对象来表示它,可以引用它来推断类型。可以通过decltype(*this) 上课。

    【讨论】:

      【解决方案3】:

      我能想到的最便携的方式是使用decltype

      #define RESULT(func, ...) Result<decltype(func(__VA_ARGS__))>
      
      int main(int argc, char **argv) {
          RESULT(main, argc, argv) result; // same as `Result<int> result;`
      }
      

      但这会强制你将函数名和它所接受的每个参数传递给RESULT 宏。我不认为这是可以避免的,因为没有可移植的(通常甚至不是特定于编译器的)方法来获取当前函数的标识符和/或传递的参数。由于过多的歧义,争论通过了。

      这是一个 SSCCE:http://ideone.com/cPTjjF

      【讨论】:

      • 你不需要可变参数业务,只需将RESULT定义为RESULT(f) Result&lt;decltype(f)&gt;,然后使用RESULT(main(argc, argv))...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2013-06-08
      • 1970-01-01
      • 2019-02-10
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多