编写泛型算法同时避免std::function C++

tpgth1q7  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(111)

我编写了一段通用代码,它接受一组std::function作为参数。

void algorithm(function f, function g,...) {
    ...
    f(...)
    ...
    g(...)
    ....
}

函数f可以从一组函数(f1,f2,...)中选择,g可以从一组具有相同签名的函数(g1,g2,...)中选择。有没有一种方法可以为多个参数集自动编译algorithm多次?
因此,一个版本algorithm_f1_g2编译为f=f1g=g1等等。
我已经尝试过使用宏,但我没有得到很远。
PS:我真的希望这种通用的行为 * 在编译时 *,最大的速度。

oug3syen

oug3syen1#

既然你可以将函数限制在一些预定义的集合中(这意味着我们不必担心支持函数指针或任意函数),你可以将algorithm实现为带有函数指针参数的function template

// Known signature for 'algorithm' parameters.
using AlgoFunction = void (*)(int);

// Set of predetermined parameter functions.
void f1(int){ /* ... */ }
void f2(int){ /* ... */ }
void ga(int){ /* ... */ }
void gb(int){ /* ... */ }

template <AlgoFunction f, AlgoFunction g>
void algorithm()
{
    // ...
    f(1);
    // ...
    g(2);
    // ...
}

可用作

algorithm<f1, ga>();

可选地,您甚至可以为特定的专门化命名。比如说,

constexpr auto algorithm_1a = algorithm<f1, ga>;

int main() {
    algorithm_1a();
}
f2uvfpb9

f2uvfpb92#

你可以使用function template来实现:

template<class T, class U>
void algorithm(T f, U g)
{
    f();
    g();
}

然后,当您在代码中添加对algorithm的任何调用时,编译器将使用您在生成的代码中提供的参数为模板创建一个示例(一个 actual 函数):

void f1()
{
    std::cout << "f1\n";
}

void f2()
{
    std::cout << "f2\n";
}

void g1()
{
    std::cout << "g1\n";
}

void g2()
{
    std::cout << "g2\n";
}

int main()
{
    algorithm(f1, g1); 
    algorithm(f2, g2); 
    return 0;
}

相关问题