【发布时间】: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<HFILE>。这是一个简化的例子:写RESULT而不是Result<HFILE>没什么大不了的,但是还有其他一些场景,当前函数的返回类型不容易获得。
【问题讨论】:
-
我猜你至少必须将函数名传递给宏(例如
RESULT(MyOpenFile)),在重载的情况下,你仍然会遇到歧义。即使getting a pointer to the current function 也很棘手,如果不重新命名函数,似乎不可能获得正确类型的指针。 -
@MvG,您可以通过将函数 + 参数传递给
decltype来解决过载歧义,例如decltype(foo(b))、decltype(foo(a, b))将正确解析。但是,这很痛苦.. -
如果确实存在,则必须限制用户可以使用该信息做什么。递归使用此类信息可能会使函数的返回类型无法确定。
标签: c++ c++11 type-inference