如何将具有不同参数的 std::function 传递给同一函数
How to pass std::function with different parameters to same function
我希望将三个函数合并在一起。
每个都以std::function
作为第一个参数,然后在try
/catch
块中执行。
问题是,存在三种不同类型的函数。不带参数的函数、带一个整数参数的函数和带两个整数参数的函数。整型参数的也有对应的参数通过原函数传递。
可以看出,每个功能几乎相同,所以如果我能将它们合并在一起就好了。但是,无论如何,我不确定是否要设置一个可以接收任何形式的 std::function
的参数,并且还依赖于它已经提供了相应的数据以供使用。
函数如下:
void run_callback(std::function<void()>& func) {
try {
func();
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
void run_callback_int(std::function<void(int)>& func, int data) {
try {
func(data);
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
void run_callback_intint(std::function<void(int, int)>& func, int data1, int data2) {
try {
func(data1, data2);
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
如有任何建议,我们将不胜感激!
它似乎适用于可变参数模板。
类似于:
template <typename ... Args>
void run_callback(std::function<void(Args...)> const & func, Args ... as) {
try {
func(as...);
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
或(可能更好地管理可能的转发)
template <typename ... FArgs, typename ... Args>
void run_callback(std::function<void(FArgs...)> const & func,
Args && ... as) {
try {
func(std::forward<Args>(as)...);
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
我建议使用 lambda 函数:
void run_callback(std::function<void()>& func) {
try {
func();
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
要调用此函数,您应该:
run_callback([]{ func_without_params(); });
或
run_callback([&]{ func_with_1_param(a); });
以此类推
我希望将三个函数合并在一起。
每个都以std::function
作为第一个参数,然后在try
/catch
块中执行。
问题是,存在三种不同类型的函数。不带参数的函数、带一个整数参数的函数和带两个整数参数的函数。整型参数的也有对应的参数通过原函数传递。
可以看出,每个功能几乎相同,所以如果我能将它们合并在一起就好了。但是,无论如何,我不确定是否要设置一个可以接收任何形式的 std::function
的参数,并且还依赖于它已经提供了相应的数据以供使用。
函数如下:
void run_callback(std::function<void()>& func) {
try {
func();
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
void run_callback_int(std::function<void(int)>& func, int data) {
try {
func(data);
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
void run_callback_intint(std::function<void(int, int)>& func, int data1, int data2) {
try {
func(data1, data2);
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
如有任何建议,我们将不胜感激!
它似乎适用于可变参数模板。
类似于:
template <typename ... Args>
void run_callback(std::function<void(Args...)> const & func, Args ... as) {
try {
func(as...);
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
或(可能更好地管理可能的转发)
template <typename ... FArgs, typename ... Args>
void run_callback(std::function<void(FArgs...)> const & func,
Args && ... as) {
try {
func(std::forward<Args>(as)...);
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
我建议使用 lambda 函数:
void run_callback(std::function<void()>& func) {
try {
func();
} catch(const std::exception& ex) {
print_callback_error(ex.what());
} catch(const std::string& ex) {
print_callback_error(ex.c_str());
} catch(...) {
print_callback_error();
}
}
要调用此函数,您应该:
run_callback([]{ func_without_params(); });
或
run_callback([&]{ func_with_1_param(a); });
以此类推