summaryrefslogtreecommitdiff
path: root/plugingui/tester.cc
diff options
context:
space:
mode:
Diffstat (limited to 'plugingui/tester.cc')
-rw-r--r--plugingui/tester.cc50
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);
+
+}