| 12
 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