在c++中传递带有可变形参的函数指针作为实参



我试图传递一个函数,具有可变数量的参数,作为我的函数baz()的参数。我真的不知道如何去做,但希望我下面提供的例子显示了我目前的思考过程。

#include <iostream>
template<typename... Ts>
void foo(void (*func)(Ts...)){
func(Ts...);
}
void bar(int a, int b, std::string c){
std::cout << "Test a: " << a << " Test b: " << b << " Test c: " << c << "n";
}
void baz(int x, int y){
std::cout << x+y << "n";
}
int main()
{
foo(&bar, 10, 20, "Hello!"); // Expected: "Test a: 10 Test b: 20 Test c: Hello!"
foo(&baz, 2, 2);             // Expected: "4"
// main.cpp:13:12: error: expected primary-expression before ‘...’ token
return 0;
}

感谢您的帮助。

可以传递一个函数类型

#include <iostream>
template<typename Fn, typename ... Ts>
void foo( Fn&& func, Ts...ts ){
func(ts...);
}
void bar(int a, int b, std::string c){
std::cout << "Test a: " << a << " Test b: " << b << " Test c: " << c << "n";
}
void baz(int x, int y){
std::cout << x+y << "n";
}
int main()
{
foo(&bar, 10, 20, "Hello!"); // Expected: "Test a: 10 Test b: 20 Test c: Hello!"
foo(&baz, 2, 2);             // Expected: "4"
return 0;
}

生产

Program stdout
Test a: 10 Test b: 20 Test c: Hello!
4

Godbolt: https://godbolt.org/z/beMv6a9a4

或者您可以稍微改变您的方法,而不是自己传递参数,您可以让lambda捕获它们。

#include <iostream>
#include <type_traits>
// you can call foo with any invocable
// and even let it return the return value of that invocable.
template<typename fn_t>
auto foo(fn_t&& fn ) -> std::enable_if_t<std::is_invocable_v<fn_t>, decltype(fn())>
{
std::cout << "foo beginn";
// slightly different handling for functions returning a void
if constexpr (std::is_same_v<decltype(fn()), void>)
{
fn();
std::cout << "foo endn";
}
else
{
auto retval = fn();
std::cout << "foo endn";
return retval;
}
}
void bar(int a, int b, std::string c) 
{
std::cout << "Test a: " << a << " Test b: " << b << " Test c: " << c << "n";
}
int baz(int x, int y) 
{
std::cout << x + y << "n";
return x + y;
}
int main()
{
int x{ 2 };
int y{ 3 };
foo([&] { bar(x, y, "Hello!"); } );
int sum = foo([&] { return baz(x,y); });
return sum;
}

最新更新