Bon bah j'ai réussi recoder std::function
#define FUNCTION
namespace sfgl {
template<typename T> class Function {
public :
template <typename R, typename ...A> Function (R(*f)(A...)) {
typename std::decay<R(A...)>::type function;
}
template <typename R, typename ...A> R operator()(A... args)
{
return f(args...);
}
using function = typename std::decay<T>::type;
};
Mais là je ne l'ai fait que pour les fonctions non membres, je vais faire la même chose pour les autres types de fonction, et ensuite ça sera bon. ^^
Pour recoder std::bind ce n'est pas très compliqué non plus :
template <typename R , typename ...A> struct Bind <R(A...)> {
Bind (R(*f)(A...), A... args) : f(f) {
params = std::make_tuple(std::forward<A>(args)...);
}
Bind (R(*f)(A...)) : f(f) {
}
template<int ...S>
R operator ()() {
return callFunc(typename helper::gens<sizeof...(A)>::type());
}
R operator()(A... args) {
return f(args...);
}
template<int ...S>
R callFunc(helper::seq<S...>)
{
return f(std::get<S>(params) ...);
}
std::tuple <A...> params;
Function<R(A...)> f;
};
Et le helper :
namespace sfgl {
namespace helper {
template<int ...> struct seq {};
template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};
template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };
}
Bon, le code n'est pas encore tout à fait au point car il manque le std::decay pour ma classe bind, mais, en gros c'est ça. (Sans les placeholder du moins, avec les placeholders je ne sais pas trop comment ça fonctionne mais je n'en ai pas besoin)
Je pense que je vais simplement mettre un type à la place des arguments pour les place holders et remplacer le tuple par les vrais arguments lors de l'appel à l'opérator().
Bref finalement ce n'étais pas si compliqué que ça.
Les codes source que j'ai trouvé sur internet étaient pas bons, pour ça que j'y ai passé des journées. :/ (A part le code source du helper pour ma classe bind)