1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <functional>
struct arg_separator {};
template<typename Ret, typename ... Args>
struct func_type {
typedef std::function<Ret(Args...)> type;
template<typename T>
func_type<Ret, Args..., T> push_back();
template<typename T>
func_type<Ret, T, Args...> push_front();
};
template<typename ... Args>
struct build_f1_type_;
template<typename Type, typename T, typename ... Args>
struct build_f1_type_<Type, T, Args...> {
typedef typename build_f1_type_<decltype(((Type*)0)->template push_back<T>()), Args...>::type type;
};
template<typename Type, typename ... Args>
struct build_f1_type_<Type, arg_separator, Args...> {
typedef typename Type::type type;
};
template<typename Type, typename T>
struct build_f1_type_<Type, T> {
typedef typename decltype(((Type*)0)->template push_back<T>())::type type;
};
template<typename Ret, typename ... Args>
using f1_type = typename build_f1_type_<func_type<Ret>, Args...>::type;
template<typename ... Args>
struct test {
f1_type<Args...> f1;
}
int main() {
test<void,int,arg_separator,bool,const std::string&> t;
} |
Partager