LINUX.ORG.RU

История изменений

Исправление pavlick, (текущая версия) :

Ну не все же такие клоуны как ты, мы крестики умеем в отличии от тебя, и параметры парсить умеем.

#include <functional>
#include <type_traits>
#include <tuple>
using namespace std;


template<typename T> 
struct fn_traits;  
template<typename R, typename ...Args> 
struct fn_traits<std::function<R(Args...)>>
{
    static constexpr size_t args_cnt = sizeof...(Args);
    typedef R result_type;
    template <size_t i>
    struct arg {
        using type = typename std::tuple_element<i, std::tuple<Args...>>::type;
    };
};

void f1(int) {}
void f2(int&) {}

template <class T>
void test(T &&fn) 
{
	using fn_t = decltype(function(fn));
	static_assert(fn_traits<fn_t>::args_cnt == 1);
	static_assert(same_as<typename fn_traits<fn_t>::result_type, void>, "wrong type of function");
	static_assert(same_as<typename fn_traits<fn_t>::arg<0>::type, int>, "wrong type of function");
}

int main() {
	test(f1);         //ok
	test(f2);         //error
	test([](int){});  //ok
}

А вообще автор сам не знает чего хочет, даже задачу сформулировать не может.

Исходная версия pavlick, :

Ну не все же такие клоуны как ты, мы крестики умеем в отличии от тебя, и параметры парсить умеем.

#include <functional>
#include <type_traits>
#include <tuple>
using namespace std;


template<typename T> 
struct fn_traits;  
template<typename R, typename ...Args> 
struct fn_traits<std::function<R(Args...)>>
{
    static constexpr size_t args_cnt = sizeof...(Args);
    typedef R result_type;
    template <size_t i>
    struct arg {
        using type = typename std::tuple_element<i, std::tuple<Args...>>::type;
    };
};

void f1(int) {}
void f2(int&) {}

template <class T>
void test(T &&fn) 
{
	using fn_t = decltype(function(fn));
	static_assert(fn_traits<fn_t>::args_cnt == 1);
	static_assert(same_as<typename fn_traits<fn_t>::result_type, void>, "wrong type of function");
	static_assert(same_as<typename fn_traits<fn_t>::arg<0>::type, int>, "wrong type of function");
}
//template <class T>
//void t(T t) {
//    static_assert(same_as<int, T>, "wrong type of function");
//}
int main() {
	test(f1);         //ok
	test(f2);         //error
	test([](int){});  //ok
}

А вообще автор сам не знает чего хочет, даже задачу сформулировать не может.