我想编写一个日志函数或宏,它可以接受其他回调函数作为参数,并在内部运行回调函数、日志运行时和名称。但是回调函数可能有不同的参数类型和数目,我不想显式地将回调函数的名称作为参数传递。
我尝试使用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"));
另外,回调函数可能有不同的返回类型,是否可以实现这样的日志函数?
发布于 2015-07-10 07:28:08
函数(和变量等)的名称在编译时丢失。编译器(实际上)不知道函数的名称。您可以使用__FUNCTION__获取您所在的函数的名称,但在本例中并不有用。您也许可以使用一个替代bind的宏来做一些事情,或者简单的解决方案是将一个字符串与函数一起作为参数传递给log。
宏解决方案更复杂,因为您必须处理变量参数,但是类似这样的方法会奏效):
#define LOG(f, ...) log(std::bind(f, __VA_ARGS__), #f)并修改log以:
void log(std::function<void()> callbackFunc, const char* name)编辑:通过使log成为一个模板函数,并使用模板作为std::function返回类型中的类型参数,可以处理不同的返回类型:
template<typename RET>
void log(std::function<RET()> callbackFunc)(我还没有测试过这个,但我相信它会成功的)
发布于 2015-07-10 07:27:57
您可以将日志调用包装在一个可变宏(正如您“猜到的”)中,以获取参数本身(函数地址)以及它的名称:
#define log(f, ...) _log(std::bind(f, __VA_ARGS__), #f)
void _log(std::function<void()> callbackFunc, const char *fName){
// ...
}
log(callbackFunc1, 1);https://stackoverflow.com/questions/31334775
复制相似问题