gpt4 book ai didi

c++ - 如何使对模板函数的调用不那么冗长

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:01 25 4
gpt4 key购买 nike

有一个函数

template <class ...T>
void foo(std::function<void(T...)> callback);

我向其中传递回调。

我想做这样的事情

foo(bar);

例如,bar

void bar(int a, long b, double c, float d);

但这给了我

error: no matching function for call to bar(void (&)(int, long int, double, float))

我必须调用 foo

foo(std::function<void(int, long, double, float)>(bar));

太冗长了。甚至

foo<int, long, double, float>(bar);

会更好。

foo(bar);

会很理想。

无论如何,我怎样才能使对 foo 的调用不那么冗长?

编辑 foo 的声明必须保持不变。

最佳答案

我会编写一个包装函数,将函数指针转换为一个 std::function 包装器:

template <typename... T>
void foo(std::function<void (T...)> f) {}

template <typename... T>
void foo(void (*f)(T...)) {
foo(std::function<void (T...)>(f));
}

foo() 可以通过任意一种方式调用:

void bar(int,double) {}

void foo_caller() {
foo(std::function<void (int,double)>(bar));
foo(bar);
}

附录:非静态成员函数包装器

相同的方法可用于指向成员函数的指针——只需添加另一个重载:

template <typename C,typename... T>
void foo(void (C::*f)(T...)) {
foo(std::function<void (C *,T...)>(f));
}

请注意成员函数的 this 指针的额外第一个参数。用法类似:

struct quux {
void mf(char *,double) {}
};

void foo_caller() {
foo(&quux::mf);
}

关于c++ - 如何使对模板函数的调用不那么冗长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28937646/

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