I have three functions I'm looking to merge together.
Each one takes an std::function
as the first parameter, then executes it within a try
/catch
block.
The issue is, there are three different types of functions. Functions with no parameters, those with one integer parameter, and those with two integer parameters. The ones with integer parameters also have their corresponding parameters passed through the original function.
As one can see, each of the functions are nearly identical, so it would be nice if I could merge them all together. However, I'm unsure of anyway to setup a parameter that can receive any form of std::function
and also rely on the fact it has been provided with corresponding data to use.
Here are the functions:
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();
}
}
Any suggestions would be greatly appreciated!
Function Call When calling a function with a function parameter, the value passed must be a pointer to a function. Use the function's name (without parentheses) for this: func(print); would call func , passing the print function to it.
Variable number of arguments in C++Define a function with its last parameter as ellipses and the one just before the ellipses is always an int which will represent the number of arguments. Create a va_list type variable in the function definition. This type is defined in stdarg. h header file.
Function overloading is a feature of object-oriented programming where two or more functions can have the same name but different parameters.
It seems to work with variadic templates.
Something like:
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();
}
}
or (maybe better to manage possible forwarding)
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();
}
}
I suggest to use a lambda 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();
}
}
To call this function you should:
run_callback([]{ func_without_params(); });
or
run_callback([&]{ func_with_1_param(a); });
And so on
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With