История изменений
Исправление
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
}
А вообще автор сам не знает чего хочет, даже задачу сформулировать не может.