首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现loggin函数或宏可以记录日期和函数名。

实现loggin函数或宏可以记录日期和函数名。
EN

Stack Overflow用户
提问于 2015-07-10 07:19:21
回答 2查看 126关注 0票数 1

我想编写一个日志函数或宏,它可以接受其他回调函数作为参数,并在内部运行回调函数、日志运行时和名称。但是回调函数可能有不同的参数类型和数目,我不想显式地将回调函数的名称作为参数传递。

我尝试使用std::bind和std::function

空日志(std::function callbackFunc){ //假设所有callbackFunc返回类型都是void,tmEnd;gettimeofday(& tmBegin );callbackFunc();gettimeofday(& tmEnd );//然后将tmEnd- tmBegin写到文件/,但我不知道如何获得callbackFunc的name} void callbackFunc1(int);voidcallbackFunc2(int,char,string);log(std::bind(callbackFunc1,1));log(std::bind(callbackFunc2,2,'c',"test"));

另外,回调函数可能有不同的返回类型,是否可以实现这样的日志函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-10 07:28:08

函数(和变量等)的名称在编译时丢失。编译器(实际上)不知道函数的名称。您可以使用__FUNCTION__获取您所在的函数的名称,但在本例中并不有用。您也许可以使用一个替代bind的宏来做一些事情,或者简单的解决方案是将一个字符串与函数一起作为参数传递给log

宏解决方案更复杂,因为您必须处理变量参数,但是类似这样的方法会奏效):

代码语言:javascript
复制
#define LOG(f, ...) log(std::bind(f, __VA_ARGS__), #f)

并修改log以:

代码语言:javascript
复制
void log(std::function<void()> callbackFunc, const char* name)

编辑:通过使log成为一个模板函数,并使用模板作为std::function返回类型中的类型参数,可以处理不同的返回类型:

代码语言:javascript
复制
template<typename RET>
void log(std::function<RET()> callbackFunc)

(我还没有测试过这个,但我相信它会成功的)

票数 2
EN

Stack Overflow用户

发布于 2015-07-10 07:27:57

您可以将日志调用包装在一个可变宏(正如您“猜到的”)中,以获取参数本身(函数地址)以及它的名称:

代码语言:javascript
复制
#define log(f, ...) _log(std::bind(f, __VA_ARGS__), #f)

void _log(std::function<void()> callbackFunc, const char *fName){
   // ...
}

log(callbackFunc1, 1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31334775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档