diff options
Diffstat (limited to 'plugingui/tester.cc')
-rw-r--r-- | plugingui/tester.cc | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/plugingui/tester.cc b/plugingui/tester.cc new file mode 100644 index 0000000..a6dfb6d --- /dev/null +++ b/plugingui/tester.cc @@ -0,0 +1,50 @@ +#include <functional> +#include <type_traits> +#include <utility> + +template <std::size_t... Is> +struct indices {}; + +template <std::size_t N, std::size_t... Is> +struct build_indices + : build_indices<N-1, N-1, Is...> {}; + +template <std::size_t... Is> +struct build_indices<0, Is...> : indices<Is...> {}; + +template<int I> struct placeholder{}; + +namespace std{ +template<int I> +struct is_placeholder< ::placeholder<I>> : std::integral_constant<int, I>{}; +} // std:: +namespace detail{ + template<std::size_t... Is, class Ret, class Fn, class... MArgs, class... Args> + auto my_bind(indices<Is...>, Ret (Fn::*f)(MArgs...), Fn *i, Args&&... args) + -> decltype(std::bind(f, i, std::forward<Args>(args)..., placeholder<1 + Is>{}...)){ + return std::bind(f, i, std::forward<Args>(args)..., placeholder<1 + Is>{}...); + } +} + +template<class Ret, class... FArgs, class Fn, class... MArgs, class... Args> +auto my_bind(std::function<Ret(FArgs...)>, Ret (Fn::*f)(MArgs...), Fn *i, Args&&... args) + -> decltype(detail::my_bind(build_indices<sizeof...(FArgs) - sizeof...(Args)>{}, f, i, std::forward<Args>(args)...)){ + + return detail::my_bind(build_indices<sizeof...(FArgs) - sizeof...(Args)>{}, f, i, std::forward<Args>(args)...); +} + + +#include <iostream> +struct tmp{ + void testt(int var1, int var2){ + std::cout << var1 << " " << var2 << std::endl; + } +}; + +int main(){ + + tmp TMP; + auto f3 = my_bind(std::function<void(int, int)>(), &tmp::testt, &TMP); + f3(22, 23); + +} |