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;`
}