有没有办法得到“当前函数”的返回类型

时间:2012-11-08 09:56:59

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

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

例如,假设我有一个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>并不是什么大问题,但还有其他情况下不容易获得当前函数的返回类型。

3 个答案:

答案 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