17

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

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

4

3 回答 3

5

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

不是你需要它,使用auto.

于 2012-11-08T10:41:22.430 回答
4

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

于 2012-11-08T10:40:46.147 回答
4

我能想到的最便携的方法是使用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

于 2012-11-08T10:42:26.830 回答