Is there a way to extract types from a function signature in the form foo(bar) and access only foo or bar . Therefore, if I have a template:
template<typename signiture> class type{ };
where signiture foo(bar) and then a function in the class that reads
foo function(bar b){
I interact with std::function and found it more convenient to use the foo(bar) syntax instead of using several template parameters, for example:
template<typename return_t,param_tps... args> class type{ return_t function(param_ps args...){ return something; } };
Let me know, can I clarify, please? Thanks at Advance.
EDIT: to clarify, I'm interested in a function with N number of parameters that will be defined by any particular instance of the class.
EDIT 2: The code on which this question is based is as follows:
using std::function; template <typename signiture> class Observer; template <typename return_t, typename ...args_t> class Observer<return_t(args_t...)> { protected: using signature = return_t(args_t...); typedef function<signature> func_t; ~Observer(){} func_t what_to_do; public: Observer(Subject<signature>& subject,func_t what):what_to_do(what){ subject.Attach(what_to_do); } return_t operator()(args_t... args){ what_to_do(args...); } }; using std::function; using std::vector; template <typename signature> class Subject; template <typename return_t,typename...param_tps> class Subject<return_t(param_tps...)> { using signature=return_t(param_tps...); public: void Attach(std::function<signature> o){ obs.push_back(o); } void operator()(param_tps... params){ for (typename vector<std::function<signature>>::const_iterator i=obs.begin(); i!=obs.end(); ++i) { (*i)(params...); } } protected: ~Subject(){} vector<std::function<signature>> obs; };
This is an implementation of the Observer pattern, which is not virtual, using std::function to glue things in between. I wanted to use the syntax foo(bar) , because all this contributes more to the ease of use of classes. The problem was converting the signature of the function type to the return type and parameter types to indicate the correct operator() in the theme class so that it could notify observers with the correct data.
The changes that were made were based on the example below:
template<typename t>struct type; template<typename R,typename... args_t> struct type<R(args_t...)>{
Thanks to everyone who helped.