我想编写一个模板,它将获取实例化函数的返回类型作为参数。
例如,假设我有一个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>
并不是什么大问题,但还有其他情况下不容易获得当前函数的返回类型。
答案 0 :(得分:4)
没有。 C ++中没有任何内容涉及“当前函数”。最接近的是__func__
,但这是一个字符串文字。因此,没有任何内容可以传递给decltype
。
auto
并非您需要它。
答案 1 :(得分:3)
在函数内部是不可能的,因为在内存中没有专用对象来表示它,可以引用它来推断出类型。课程可以通过decltype(*this)
。
答案 2 :(得分: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