gpt4 book ai didi

c++ - 是否有可能制作一个运行注入(inject)代码并返回与注入(inject)函数相同的数据的函数包装器?

转载 作者:行者123 更新时间:2023-11-27 22:53:17 25 4
gpt4 key购买 nike

我考虑这个想法有一段时间了,但似乎无法理解它。

基本上,我想做的是创建一个通用的 Timer 类,为传递给它的所有函数计时。当同一个函数被多次调用时对其进行平均,因此它必须以某种方式存储它。因此,它应该使用函数名称来存储任务,并在它出现不止一次时对其进行平均。

它应该是什么样子的伪代码。

Class FunctionTaks
{
std::string d_name;
double d_execution_time;
}

Class Timer
{
private:
std::vector<FunctionTask> d_tasks;

public:
template <typename Function, typename ReturnType>
ReturnType time(Function f)
{
// check if function f is timed for first time
// start timer
// run function f
auto r = f.invoke();
// stop timer
// store function name and time, average if more than once
// return whatever f should return
return r;
}

void report() const;
}

我真的不知道该怎么做,尤其是当函数 f 有不同数量的参数时。

Timer t;

t.time(foo());
t.time(bar());
t.time(foo());

t.report();

我基本上有几个核心问题。

  1. 如何让函数包装器返回与注入(inject)代码假定返回的类型相同的类型。
  2. 如何获取被注入(inject)的函数名。
  3. 包装器不应受到传递给注入(inject)函数的参数的限制。如何为注入(inject)的函数提供参数的自由。

另一方面,我并不真正关心参数和返回类型,包装器应该简单地按原样运行注入(inject)函数并执行一些计时,然后返回注入(inject)函数应该返回的任何内容。

最佳答案

C++11 但为什么是模板?你需要 lambda 表达式:

typedef void(*TimerFunction)();

void time(TimerFunction fun) {
// start timer
fun();
// stop timer
}

int fun1() { return 1; }

int fun2() { return 2; }

string fun3() { return string("Test"); }

main() {
int ret1, ret2;
string ret3;
t.time([&ret1]() { ret1 = fun1(); });
t.time([&ret2]() { ret2 = fun2(); });
t.time([&ret3]() { ret3 = fun3(); });

}

这就是概念。详情:C++ lambda with captures as a function pointer

关于c++ - 是否有可能制作一个运行注入(inject)代码并返回与注入(inject)函数相同的数据的函数包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35510517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com