Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++_Visual C++_Operators_Operator Overloading - Fatal编程技术网

C++ 获取被调用函数的名称

C++ 获取被调用函数的名称,c++,visual-c++,operators,operator-overloading,C++,Visual C++,Operators,Operator Overloading,当使用“.”、“->”或“->*”运算符时,是否有任何方法可以获取所调用函数的名称(或者在“->*”情况下获取变量的名称,然后一切都会发生 编辑: 为了澄清,我不是在谈论反射,而是更多关于“函数””的内容。基本上,我想创建一个操作符重载(最好是上述三个操作符之一),它知道操作符的右侧 我试图完成的基本上是编译时转换 obj->Function(a,b); 到 编辑:为了进一步澄清,要求代码必须看起来像这三种代码之一 obj.SomeMethod(args); obj->SomeMe

当使用“.”、“->”或“->*”运算符时,是否有任何方法可以获取所调用函数的名称(或者在“->*”情况下获取变量的名称,然后一切都会发生

编辑: 为了澄清,我不是在谈论反射,而是更多关于“函数””的内容。基本上,我想创建一个操作符重载(最好是上述三个操作符之一),它知道操作符的右侧

我试图完成的基本上是编译时转换

obj->Function(a,b);

编辑:为了进一步澄清,要求代码必须看起来像这三种代码之一

obj.SomeMethod(args);
obj->SomeMethod(args);
obj->*SomeMethod(args);
只要SomeMethod可以是任何有效的标识符(即任何可以用作函数名的东西),任何适合的解决方案都是可以接受的,并且该解决方案必须使用SomeMethod作为映射中的查找。映射部分已经实现,它只是对我寻求解决方案的方法调用的重新解释


如果无法完成此操作(如我所震惊的),则任何具有新“运算符”语法的解决方案都将被接受。例如obj_u u; somethod(args);只要查找基于“运算符”的RHS

C++没有任何类型的反射。在可执行文件运行时,函数名已经消失。唯一的方法是将它们传入


如果你打算根据方法名做一些事情,也许你只需要虚拟方法或重载,以便调用正确的代码。C++,< / P> < P>我知道,不,C++不支持任何形式的反射,所以为了得到这种信息,你必须设计自己的工具和技巧。除非你想用它进行调试,否则你不应该真的需要它。即使没有它,调试也可以完成

编辑的回答:要么使用某种带有多个重载
操作符()
函数的函子,要么映射必须只包含相同类型的函数,或者至少包含相同参数和返回值的函数(如果您愿意使用类似
boost::function
)。如果将functor与重载运算符()一起使用,则将放弃编译时类型安全性,并且将限制为某些N参数

您决定执行的操作类似于
boost::bind
/
boost::function
。请查看它们的标题。除非您想分别限制您的实现,否则您不可能得到比它们更简单的实现

当使用“.”、“->”或“->”运算符时,是否有任何方法可以获取所调用函数的名称(或在“->”的情况下获取变量的名称以及所有内容

没有内置的机制(我知道)允许这样做

您可以在编译时使用
\uuuu function\uuuu
宏获取当前函数的名称。它不是标准的,但在MSVC上受支持,在g++上可能受支持(不确定)

如果您想在运行时知道函数名,那么您必须为此实现某种特殊机制—构建一个函数名和地址表(将在启动时初始化)并在每次需要地址中的函数名时搜索函数名。如果编译器支持
\uuuuu function\uuuuu
宏或有任何其他获取当前函数名的方法,则可以通过使用宏来简化此过程(可以包装整个“注册”)过程转换为单个宏调用,该宏调用将放在要注册的函数中)。这可能是不可移植的


程序的调试信息也可能包含您所寻找的信息,但它比依赖于<代码>函数> <代码>宏>

我已经解决了您最近面临的问题。我正在对C++进行JavaScript绑定,需要有一个具有名称->函数的映射。/p>
vector<WebValue> params;  // Parameters for the function, I get these from the JS engine usually
params.push_back(asValue("Some string"));
params.push_back(asValue(123456));
params.push_back(asValue(1.0f));
functionMap["SomeFunction"]->call(params);  // SomeFunction must accept char*, int and float compatible parameters
functionMap["SomeFunction"] = jsExport(this, &MyClass::SomeFunction);
或者,如果它是一个成员函数,并且“this”在当前范围内可用,则如下所示:

regMember(SomeFunction);
我使用了Boost Fusion和Boost函数类型来完成这项肮脏的工作。它可以在OpenLieroX项目的源代码中找到:

它的用法:
-包含将函数注册到映射的方法
-包含用于注册成员函数的handy regMember宏

您可能还需要查看目录中的其他文件,以便更好地理解:


这并不完全是你在问题中描述的方式,但希望它能帮助你。

这是设计工具和技巧的过程,我被困在其中,不,我不需要反射(这将是运行时)我很高兴解决这个问题time@Rune:我会尝试使用非常危险和复杂的宏,或者使用一个预处理器来发现调用并将其替换为智能调用。Qt moc也有类似的功能,但我不能推荐任何解决方案。您所做的有点超出了语言和编译器的限制。您似乎我已经意识到了这一点,即宏/预处理器指令的使用非常危险和复杂,我正试图弄明白,并感谢您的警告,我非常清楚这一风险。这并不是我问题的解决方案,但至少您理解了这个问题:)您知道我的需求吗:):)我真的需要这个来完成我开始做的事情(我必须承认我怀疑这是可行的),不,这不是为了调试谢谢编辑后的更新。我已经实现了它的函子部分,这是最简单的部分。所以现在我有了地图,我现在需要能够画一条看起来像obj->SomeFunction(params)的线,并将其转换成obj->map[“SomeFunction”](params)。我在boost中没有看到任何东西可以解决这个特定的问题(代码部分的“重写”),如果我愿意,可以免费纠正我
regMember(SomeFunction);