Определение типа параметра функции

Я использовал следующий код для определения длинного аргумента данной функции.

Итак, учитывая:

int f(int *) { return 0; }

Я хочу извлечь int *,

Вот моя попытка:

template<class T, class U> struct SingleArg {
typedef U MyArg;
};

template<class T, class U> SingleArg<T, U> fT(T (*p)(U));

int main() {
std::result_of<decltype(fT(f))>::type::MyArg t;
}

Это, однако, не работает и GCC 4.6 дает ошибку

> error: std::result_of<SingleArg<int, int*> >::type has not been
> declared

Итак, у меня есть два вопроса:

а) Что не так с приведенным выше кодом?

б) Можно ли сделать это любым другим способом / способами?

2

Решение

int f(int *) { return 0; }

template<class T, class U> struct SingleArg {
typedef U MyArg;
};template<typename T>
struct the_same_type
{
typedef T type;
};

template<class T, class U> SingleArg<T, U> fT(T (*p)(U));

int main() {

int k;
the_same_type<decltype(fT(f))>::type::MyArg t= &k;
return 0;
}
0

Другие решения

#include <type_traits>

template <typename Function>
struct arg_type;

template <class Ret, class Arg>
struct arg_type<Ret(Arg)> {
typedef Arg type;
};int f(int *) {
return 0;
};

int main(int, char**) {
static_assert(std::is_same<int*, arg_type<decltype(f)>::type>::value, "different types");
}
5

Это работает для меня:

// if you want the type
typedef decltype(fT(f))::MyArg theType;

// if you want the name (may need demangling depending on your compiler)
std::cout << typeid(decltype(fT(f))::MyArg).name() << std::endl;

Для разборки см. Например abi::__cxa_demangle,

0
По вопросам рекламы [email protected]