具有可变数量和类型参数的 C++ 函数作为另一个函数的参数
C++ Function with variable number and types of arguments as argument of another function
我想创建调用另一个函数并打印其参数的函数。
它应该与许多具有参数变量组合的函数(返回相同的结果)兼容。
我想要这样的东西:
int fun1(){}
int fun2(int i){}
int fun3(std::string s, int i){}
void execute_and_print(std::function f, ...)
{
///code
}
int main()
{
execute_and_print(&fun1);
execute_and_print(&fun2, 3);
execute_and_print(&fun3,"ff",4);
}
它可以打印:
executed function with arguments:
executed function with arguments: 3
executed function with arguments: ff, 4
甚至可以用 C++ 实现吗?
它不是万无一失的,但是任何可能的错误都会在编译时被捕获(即代码不会编译)。它应该工作文件,只要提供的参数与被调用函数的参数匹配,并且每个参数都存在匹配的 <<
运算符。
template<class Fn, class...Args>
void execute_and_print(Fn fn, Args...args) {
int f[sizeof...(Args)] = { (std::cout << args << ", ", 0)... };
fn(args...);
}
参考https://en.cppreference.com/w/cpp/language/parameter_pack。 sizeof...
命令实际上是元素的数量,而不是它们的组合大小。
您可以使用模板来完成,
template <class... Args>
void RunThrough(Args&& ... args)
{
([&](auto& input)
{
std::cout << input << ", ";
} (args), ...);
}
template<class Func, class... Args>
decltype(auto) execute_and_print(Func f, Args&&... args)
{
f(args...);
std::cout << "executed function with arguments: ";
RunThrough(args...);
std::cout << std::endl;
}
您可以在其中使用 lambda、std::function
对象和函数指针。
参考:
在C++17中非常简单
template <typename F, typename... Args>
void execute_and_print(F f, Args... args)
{
(std::cout << ... << args);
f(args...);
}
在此之前还有额外的仪式
template <typename F, typename... Args>
void execute_and_print(F f, Args... args)
{
int dummy[] = { (static_cast<void>(std::cout << args), 0)... };
f(args...);
}
我想创建调用另一个函数并打印其参数的函数。
它应该与许多具有参数变量组合的函数(返回相同的结果)兼容。
我想要这样的东西:
int fun1(){}
int fun2(int i){}
int fun3(std::string s, int i){}
void execute_and_print(std::function f, ...)
{
///code
}
int main()
{
execute_and_print(&fun1);
execute_and_print(&fun2, 3);
execute_and_print(&fun3,"ff",4);
}
它可以打印:
executed function with arguments:
executed function with arguments: 3
executed function with arguments: ff, 4
甚至可以用 C++ 实现吗?
它不是万无一失的,但是任何可能的错误都会在编译时被捕获(即代码不会编译)。它应该工作文件,只要提供的参数与被调用函数的参数匹配,并且每个参数都存在匹配的 <<
运算符。
template<class Fn, class...Args>
void execute_and_print(Fn fn, Args...args) {
int f[sizeof...(Args)] = { (std::cout << args << ", ", 0)... };
fn(args...);
}
参考https://en.cppreference.com/w/cpp/language/parameter_pack。 sizeof...
命令实际上是元素的数量,而不是它们的组合大小。
您可以使用模板来完成,
template <class... Args>
void RunThrough(Args&& ... args)
{
([&](auto& input)
{
std::cout << input << ", ";
} (args), ...);
}
template<class Func, class... Args>
decltype(auto) execute_and_print(Func f, Args&&... args)
{
f(args...);
std::cout << "executed function with arguments: ";
RunThrough(args...);
std::cout << std::endl;
}
您可以在其中使用 lambda、std::function
对象和函数指针。
参考:
在C++17中非常简单
template <typename F, typename... Args>
void execute_and_print(F f, Args... args)
{
(std::cout << ... << args);
f(args...);
}
在此之前还有额外的仪式
template <typename F, typename... Args>
void execute_and_print(F f, Args... args)
{
int dummy[] = { (static_cast<void>(std::cout << args), 0)... };
f(args...);
}