#include <iostream>
#include <tuple>

using namespace std;

template <typename Ret, typename... Args>
tuple<Args...> m(Ret(Args...));

template <typename Ret, typename C, typename... Args>
tuple<Args...> m(Ret(C::*)(Args...));

void foo(char, short);

struct bar { void foo(char, short); };

int main() {
    decltype(m(foo)) test('a', 13);
    decltype(m(bar::foo)) test2('a', 13))
    cout << get<0>(test) << endl;
}