在 C 和 C++ 中回调具有先前未知参数的函数

Ric*_*cio 1 c c++ design-patterns callback argument-passing

我正在考虑做一个take_timing函数,它将获取传递给它的任何函数的时间。对于任何函数来说,这都意味着调用者不知道该回调所采用的参数。它也需要回调的参数。但由于它不知道如何调用它,因此需要另一个回调函数,即回调的调用者,由函数用户编写。存根将是这样的:

void take_timing(
    void (*callback)(),
    void (*caller(void (*callback)(),void* args_struct),
    void* args_struct
)
{
    // Start timer

    caller(callback,args_struct);

    // Stop timer, read timings, record...
}

void some_caller(void (*callback)(),void* args_struct)
{
    // Cast "callback" to function signature
    // Cast args_struct to some struct with args
    // Call the callback with correct args signature
}
Run Code Online (Sandbox Code Playgroud)

我的问题来了:

  1. 是否可以?
  2. 它可以使用变量参数列表来使其变得简单吗?如何?我对此很无助...
  3. 有更好的方法吗?take_timing还是针对每个具体情况都做一个更好?
  4. 是否有与 C++ 一起使用的 OOP 设计模式?

我自己放弃了这个,但出于好奇把它放在这里,也许是一些非常有用的见解。

bam*_*s53 5

只需将函子作为模板参数即可。就像是:

template<typename F>
nanoseconds take_timing(F f) {

    auto start = high_resolution_clock::now();
    f();
    auto end = high_resolution_clock::now();
    return end - start;
}

long long factorial(int i);

take_timing( [](){factorial(20);} ); // wrap call to function taking arguments in zero-argument lambda
Run Code Online (Sandbox Code Playgroud)