libcopp  1.2.0
cmd_option_bind_param_list.h
Go to the documentation of this file.
1 #ifndef UTIL_CLI_CMDOPTIONBINDPARAMLIST_H
2 #define UTIL_CLI_CMDOPTIONBINDPARAMLIST_H
3 
4 #pragma once
5 
6 /*
7  * cmd_option_bind_param_list.h
8  *
9  * Created on: 2014-01-22
10  * Author: OWenT
11  *
12  * 绑定器参数列表类
13  */
14 
17 #include "cli/cmd_option_list.h"
18 
19 #if defined(UTIL_CONFIG_COMPILER_CXX_VARIADIC_TEMPLATES) && UTIL_CONFIG_COMPILER_CXX_VARIADIC_TEMPLATES
20 #include "std/tuple.h"
21 #endif
22 
23 namespace util {
24  namespace cli {
25  namespace binder {
26 
31  template <typename _Tp>
33  typedef _Tp type;
35 
36  static const _Tp &do_wrap(const _Tp &__x) { return __x; }
37 
38  static _Tp &do_wrap(_Tp &__x) { return __x; }
39  };
40 
41 
46  template <typename _Tp, typename _Class>
47  struct maybe_wrap_member_pointer<_Tp _Class::*> {
48  typedef _Tp _Class::*type;
50 
51  static type do_wrap(_Tp _Class::*__pm) { return type(__pm); }
52  };
53 
54 // ============================
55 // === 参数列表 ===
56 // ============================
57 #if defined(UTIL_CONFIG_COMPILER_CXX_VARIADIC_TEMPLATES) && UTIL_CONFIG_COMPILER_CXX_VARIADIC_TEMPLATES
58  template <typename... _Args>
59  class cmd_option_bind_param_list {
60  private:
64  template <int... _Index>
65  struct index_args_var_list {};
66 
67  template <std::size_t N, int... _Index>
68  struct build_args_index : build_args_index<N - 1, _Index..., sizeof...(_Index)> {};
69 
70  template <int... _Index>
71  struct build_args_index<0, _Index...> {
72  typedef index_args_var_list<_Index...> type;
73  };
74 
75  private:
76  template <class _F, int... _Indexes>
77  void _do_call(_F &f, callback_param args, index_args_var_list<_Indexes...>) {
78  f(args, std::get<_Indexes>(args_)...);
79  }
80 
81  private:
82  std::tuple<_Args...> args_;
83 
84  public:
85  cmd_option_bind_param_list(_Args... args) : args_(args...) {}
86 
87  template <class _F>
88  void operator()(_F &f, callback_param args, int) {
89  typedef typename build_args_index<sizeof...(_Args)>::type _index_type;
90  _do_call(f, args, _index_type());
91  }
92  };
93 
94 #else
95 
97  public:
98  template <class _F>
99  void operator()(_F &f, callback_param args, int) {
100  f(args);
101  }
102  };
103 
104  template <typename _Arg0>
106  private:
107  _Arg0 arg0_;
108 
109  public:
110  cmd_option_bind_param_list1(_Arg0 arg0) : arg0_(arg0) {}
111 
112  template <class _F>
113  void operator()(_F &f, callback_param args, int) {
114  f(args, arg0_);
115  }
116  };
117 
118  template <typename _Arg0, typename _Arg1>
120  private:
121  _Arg0 arg0_;
122  _Arg1 arg1_;
123 
124  public:
125  cmd_option_bind_param_list2(_Arg0 arg0, _Arg1 arg1) : arg0_(arg0), arg1_(arg1) {}
126 
127  template <class _F>
128  void operator()(_F &f, callback_param args, int) {
129  f(args, arg0_, arg1_);
130  }
131  };
132 
133  template <typename _Arg0, typename _Arg1, typename _Arg2>
135  private:
136  _Arg0 arg0_;
137  _Arg1 arg1_;
138  _Arg2 arg2_;
139 
140  public:
141  cmd_option_bind_param_list3(_Arg0 arg0, _Arg1 arg1, _Arg2 arg2) : arg0_(arg0), arg1_(arg1), arg2_(arg2) {}
142 
143  template <class _F>
144  void operator()(_F &f, callback_param args, int) {
145  f(args, arg0_, arg1_, arg2_);
146  }
147  };
148 
149  template <typename _Arg0, typename _Arg1, typename _Arg2, typename _Arg3>
151  private:
152  _Arg0 arg0_;
153  _Arg1 arg1_;
154  _Arg2 arg2_;
155  _Arg2 arg3_;
156 
157  public:
158  cmd_option_bind_param_list4(_Arg0 arg0, _Arg1 arg1, _Arg2 arg2, _Arg2 arg3)
159  : arg0_(arg0), arg1_(arg1), arg2_(arg2), arg3_(arg3) {}
160 
161  template <class _F>
162  void operator()(_F &f, callback_param args, int) {
163  f(args, arg0_, arg1_, arg2_, arg3_);
164  }
165  };
166 
167 #endif
168  } // namespace binder
169  } // namespace cli
170 } // namespace util
171 #endif /* _CMDOPTIONBINDPARAMLIST_H_ */
cmd_option_bind_param_list3(_Arg0 arg0, _Arg1 arg1, _Arg2 arg2)
void operator()(_F &f, callback_param args, int)
void operator()(_F &f, callback_param args, int)
cmd_option_bind_param_list4(_Arg0 arg0, _Arg1 arg1, _Arg2 arg2, _Arg2 arg3)
void operator()(_F &f, callback_param args, int)
void operator()(_F &f, callback_param args, int)
void operator()(_F &f, callback_param args, int)
导入多元组库 Licensed under the MIT licenses.