Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法获取“返回”的返回类型;“当前功能”;_C++_C++11_Type Inference - Fatal编程技术网

C++ 有没有办法获取“返回”的返回类型;“当前功能”;

C++ 有没有办法获取“返回”的返回类型;“当前功能”;,c++,c++11,type-inference,C++,C++11,Type Inference,我想编写一个模板,该模板将获取实例化它的函数的返回类型作为参数 例如,假设我有一个结果模板化类: template<type T> class Result { T _result_value; T& operator=( T that ); ~Result( ); } 所以我可以用它: HFILE MyOpenFile( ... ) { RESULT result; } …这将被推断为结果。这是一个简单的例子:编写RESULT而不是RES

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

例如,假设我有一个
结果
模板化类:

template<type T>
class Result {
    T _result_value;
    T& operator=( T that );
    ~Result( );
}
所以我可以用它:

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

…这将被推断为
结果
。这是一个简单的例子:编写
RESULT
而不是
RESULT
不是什么大问题,但是,在其他情况下,当前函数的返回类型不容易获得。

从函数内部不可能获得,因为内存中没有表示它的专用对象,可以引用它来推断类型。类可能通过代码> DECKEYPE(*this)< /COD> .< /P> < P>不。C++中没有任何引用“当前函数”的内容。最接近的是
\uuuu func\uuuu
,但这是字符串文字。因此,没有什么可以传递给
decltype


使用
auto
,您并不需要它

我能想到的最便携的方法是使用
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;`
}
#定义结果(func,…)结果
int main(int argc,字符**argv){
RESULT(main、argc、argv)RESULT;//与'RESULT'相同`
}
但这会迫使您将函数名及其所需的每个参数传递给
结果
宏。我认为这是无法避免的,因为没有可移植的(通常甚至没有特定于编译器的)方法来获取当前函数的标识符和/或传递的参数。多亏了过多的模棱两可,争论才得以通过


这里有一个SSCCE:

您可以使用吗?我想您至少需要将函数名传递给宏(例如,
结果(MyOpenFile)
),在重载的情况下,您仍然会遇到歧义。即使是这样,如果不重新命名函数,也不可能获得正确类型的指针。@MvG,您可以通过传递函数+参数来避免重载歧义,例如,
decltype(foo(b))
decltype(foo(a,b))
将正确解析。然而,这是一件痛苦的事情。如果它确实存在,那么用户对信息的处理将受到限制。递归使用此类信息可能导致函数的返回类型无法确定。您不需要varargs业务,只需将
RESULT
定义为
RESULT(f)RESULT
,然后将其用作
RESULT(main(argc,argv))
。。。
#define RESULT(func, ...) Result<decltype(func(__VA_ARGS__))>

int main(int argc, char **argv) {
    RESULT(main, argc, argv) result; // same as `Result<int> result;`
}