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 44 45 46 47 48 49 50 51 52
|
namespace
{
template<unsigned int N, typename Fc, typename ...Args>
struct ExtractTuple
{
template<typename ...Finis>
inline static auto Extract(Fc Func, const std::tuple<Args...>& t, Finis...Extracted) -> decltype(ExtractTuple<N-1, Fc, Args...>::Extract (static_cast<Fc>(Func), t, std::get<N-1>(t), Extracted...))
{
return ExtractTuple<N-1, Fc, Args...>::Extract
(static_cast<Fc>(Func), t, std::get<N-1>(t), Extracted...);
}
};
template<typename Fc, typename ...Args>
struct ExtractTuple<0u, Fc, Args...>
{
template<typename ...Finis>
inline static auto Extract(Fc Func, const std::tuple<Args...>&, Finis... Extracted) -> decltype(std::bind(Func, Extracted...))
{
return std::bind(Func, Extracted...);
}
};
template<unsigned int N,typename Fc>
struct ExtractFirst
{
template<typename ...Args>
inline static auto Extract(Fc Func, const std::tuple<Args...>& t) -> decltype(ExtractTuple<N-1, Fc,Args...>::Extract(static_cast<Fc>(Func), t, std::get<N-1>(t)))
{
return ExtractTuple<N-1, Fc,Args...>::Extract(static_cast<Fc>(Func), t, std::get<N-1>(t));
}
};
template<typename Fc>
struct ExtractFirst<0,Fc>
{
template<typename ...Args>
inline static auto Extract(Fc Func, const std::tuple<Args...>& ) -> decltype(std::bind(Func))
{
return std::bind(Func);
}
};
}
template<typename Fc,typename ...Args>
inline auto sf::GUI::Implementation::Binding<Fc,Args...>::MakeBindingObject(Fc Func, const std::tuple<Args...>& t) -> decltype(ExtractFirst<sizeof...(Args),Fc>::Extract(static_cast<Fc>(Func), t))
{
return ExtractFirst<sizeof...(Args),Fc>::Extract(static_cast<Fc>(Func), t);
} |
Partager