获取调用函数的名称

时间:2010-08-01 17:57:15

标签: c++ visual-c++ operators operator-overloading

使用'。',' - >'时或者' - > *'运算符有任何方法可以获取调用函数的名称(或者在' - > *'的情况下变量的名称,一切都可以。

修改 只是为了澄清我不是在谈论反射,而是在“函数”中更多的东西基本上我想创建一个运算符的重载(最好是所提到的三个中的一个),这意味着运营商的右侧

我想要完成的基本上是

的编译时转换
obj->Function(a,b);

obj->Map("Function")(a,b); //Where Map(string) returns a function pointer

编辑:为了进一步澄清,要求是代码必须看起来就像这三个中的一个

obj.SomeMethod(args);
obj->SomeMethod(args);
obj->*SomeMethod(args);
只要SomeMethod可以是任何有效的标识符(即任何可以用作函数名称的东西),解决方案就必须使用SomeMethod作为Map中的查找。

任何适合的解决方案都是可以接受的。 Map部分已经实现,它只是对我寻求解决方案的方法调用的重新解释。

如果那(因为我很害怕)无法完成,那么将接受任何带有新“运算符”语法的解决方案。如obj __ SomeMethod(args);只要查找基于“运算符”的RHS

5 个答案:

答案 0 :(得分:1)

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

如果您计划根据方法名称执行某些操作,可能只需要虚拟方法或重载,以便调用正确的代码。

答案 1 :(得分:1)

据我所知,没有。 C ++不支持任何形式的反射,所以为了获得这种信息,你必须设计自己的工具和技巧。

答案 2 :(得分:1)

  

使用'。',' - >'时或' - > '运算符是否有任何方法可以获取调用函数的名称(或者在' - > '的情况下变量的名称,一切都可以。

没有允许的内置机制(我知道)。

使用__FUNCTION__宏,您可以在编译期间获得当前功能的名称。它不是标准的,但它在MSVC上受支持,并且可能在g ++上受支持(不确定)。

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

程序的调试信息也可能包含您正在寻找的信息,但它比依赖__FUNCTION__宏更糟糕。

答案 3 :(得分:1)

我已经解决了你最近遇到的问题。我正在对C ++进行Javascript绑定,并且需要有一个名称为>的函数映射。功能。我正在调用这样的函数:

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 Function Types为我做脏事。它可以在OpenLieroX项目的源代码下获得:
http://bit.ly/dd70G6

使用方法:
http://bit.ly/9Sa84q - 包含将函数注册到地图的方法
http://bit.ly/b7oWNo - 包含用于注册成员函数的方便的regMember宏

您可能还想查看目录中的其他文件以便更好地理解:
http://bit.ly/b7oWNo

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

答案 4 :(得分:0)

没有。 C ++几乎没有反思。除非你想将它用于调试目的,否则你不应该真的需要它。即使没有它也可以进行调试。

回答编辑:您使用某种带有多个重载operator()函数的仿函数,或者您的地图必须只包含相同类型的函数,或者至少包含相同参数的函数和返回值(如果您愿意使用boost::function<>之类的东西)。如果你使用带有重载operator()的functor,那么你放弃了编译时类型安全性,你将被限制为N个参数。

您决定做的事情类似于boost::bind / boost::function。看看他们的标题。除非你想要分别限制你的实现,否则你不可能最终得到比他们使用的更简单的东西。