I've just started indulging myself in the advanced use of templates. I am trying to write a generalized wrapper for functions, to wrap functions that can cause exceptions. If no exception occurred the wrapper-function should write the actual return value to some reference and then return true. If an exception occurred it only returns false.
Code
#include <string> #include <iostream> #include <functional> #include <exception> #include <iomanip> template<typename TReturn, typename ... TArgs> bool Try(std::function<TReturn(TArgs...)> &function, typename std::function<TReturn(TArgs...)>::result_type& res, TArgs&...args) { try { res = function(std::forward<TArgs>(args)...); return true; } catch (...) { return false; } } std::string foo(int val) { if (val == 0) { throw std::exception(); } return "result"; } int main() { std::string res = "noResult"; //Should be "false=>noResult" std::cout << std::boolalpha << Try(foo, res, 0) << "=>" << res; //Should be "true=>result" std::cout << std::boolalpha << Try(foo, res, 1) << "=>" << res; } Expectations
I expected a template instantiation like bool Try(std::function<std::string(int)>& function, std::string& res, int&arg);
Instead It doesn't even compile:
Errors:
no instance of function template "Try" matches the argument list
and
'bool Try(std::function<_Ret(_Types...)>,std::function<_Ret(_Types...)>::result_type &,TArgs &...)': could not deduce template argument for 'std::function<_Ret(_Types...)>' from 'std::string (int)'
I guess the way I call Try could also be flawed.
I found this simliar question but I can't get it to work with a return type.
And yes, there needs to be a special overload, for functions that return void.
What am I missing and how could this be done? Thanks in advance!
Targs ...are slightly off, you probably meant to use '&&' over '&'