相关疑难解决方法(0)

函数钩在C++中?

"挂钩"是指非侵入性地覆盖函数行为的能力.一些例子:

  • 在函数体之前和/或之后打印日志消息.
  • 将函数体包裹在try catch体中.
  • 测量函数的持续时间
  • 等等...

我在各种编程语言和库中看到了不同的实现:

  • 面向方面编程
  • JavaScript的第一类函数
  • OOP装饰图案
  • WinAPI子类化
  • Ruby的 method_missing
  • SWIG%exception关键字用于包装try/catch块中的所有函数,可以(ab)用于挂钩

我的问题是:

  • IMO这是一个非常有用的功能,我想知道为什么它从未被实现为C++语言功能.是否有任何理由阻止这种情况发生?
  • 在C++程序中实现这一点有哪些推荐的技术或库?

c++

33
推荐指数
2
解决办法
6449
查看次数

类似Python的C++装饰器

有没有办法在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)

可能吗?

c++ python macros function decorator

28
推荐指数
2
解决办法
8810
查看次数

在c ++中以优雅的方式进行计时

我感兴趣的是计算自由函数或成员函数(模板与否)的执行时间.调用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)

但我不知道如何做到这一点,也不是我的目标语法/解决方案是最佳的...

c++ timing

6
推荐指数
2
解决办法
2738
查看次数

标签 统计

c++ ×3

decorator ×1

function ×1

macros ×1

python ×1

timing ×1