"挂钩"是指非侵入性地覆盖函数行为的能力.一些例子:
我在各种编程语言和库中看到了不同的实现:
method_missing%exception关键字用于包装try/catch块中的所有函数,可以(ab)用于挂钩我的问题是:
有没有办法在C++中装饰函数或方法,如python风格?
@decorator
def decorated(self, *args, **kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
以宏为例:
DECORATE(decorator_method)
int decorated(int a, float b = 0)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
要么
DECORATOR_MACRO
void decorated(mytype& a, mytype2* b)
{
}
Run Code Online (Sandbox Code Playgroud)
可能吗?
我感兴趣的是计算自由函数或成员函数(模板与否)的执行时间.调用TheFunc有问题的函数,它的调用是
TheFunc(/*parameters*/);
Run Code Online (Sandbox Code Playgroud)
要么
ReturnType ret = TheFunc(/*parameters*/);
Run Code Online (Sandbox Code Playgroud)
当然我可以按如下方式包装这些函数调用:
double duration = 0.0 ;
std::clock_t start = std::clock();
TheFunc(/*parameters*/);
duration = static_cast<double>(std::clock() - start) / static_cast<double>(CLOCKS_PER_SEC);
Run Code Online (Sandbox Code Playgroud)
要么
double duration = 0.0 ;
std::clock_t start = std::clock();
ReturnType ret = TheFunc(/*parameters*/);
duration = static_cast<double>(std::clock() - start) / static_cast<double>(CLOCKS_PER_SEC);
Run Code Online (Sandbox Code Playgroud)
但是我想做一些比这更优雅的事情,即(从现在起我将坚持使用void返回类型)如下:
Timer thetimer ;
double duration = 0.0;
thetimer(*TheFunc)(/*parameters*/, duration);
Run Code Online (Sandbox Code Playgroud)
其中Timer是我想设计的一些时序类,这将允许我编写前面的代码,这样在前面代码的最后一行的exectution之后,double duration将包含执行时间
TheFunc(/*parameters*/);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何做到这一点,也不是我的目标语法/解决方案是最佳的...