would get return, arguments types from lambda.
ok, look at the following code.<3
code
lambda_traits.hpp
#pragma once
#include <tuple>
#include <type_traits>
namespace stx
{
namespace lambda_detail
{
template<class Ret, class Cls, class IsMutable, class... Args>
struct types
{
using is_mutable = IsMutable;
enum { arity = sizeof...(Args) };
using return_type = Ret;
template<size_t i>
struct arg
{
typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
};
};
}
template<class Ld>
struct lambda_type
: lambda_type<decltype(&Ld::operator())>
{};
template<class Ret, class Cls, class... Args>
struct lambda_type<Ret(Cls::*)(Args...)>
: lambda_detail::types<Ret,Cls,std::true_type,Args...>
{};
template<class Ret, class Cls, class... Args>
struct lambda_type<Ret(Cls::*)(Args...) const>
: lambda_detail::types<Ret,Cls,std::false_type,Args...>
{};
};
main.cpp
#include <iostream>
#include <typeinfo>
#include "lambda_traits"
int main(void){
std::cout << "[is mutable lambda]" << std::endl;
{
auto test = [](int a) mutable->long{return static_cast<long>(a); };
std::cout << "ret type : " << std::is_same<stx::lambda_type<decltype(test)>::return_type,long>::value << std::endl;
std::cout << "arg size : " << stx::lambda_type<decltype(test)>::arity << std::endl;
std::cout << "arg 0 type : " << std::is_same<stx::lambda_type<decltype(test)>::arg<0>::type,int>::value << std::endl;
std::cout << "is mutable : " << std::is_same<stx::lambda_type<decltype(test)>::is_mutable,std::true_type>::value << std::endl;
}
std::cout << "[is normal lambda]" << std::endl;
{
auto test = [](int a, int b)->long{return static_cast<long>(a); };
std::cout << "ret type : " << std::is_same<stx::lambda_type<decltype(test)>::return_type,long>::value << std::endl;
std::cout << "arg size : " << stx::lambda_type<decltype(test)>::arity << std::endl;
std::cout << "arg 0 type : " << std::is_same<stx::lambda_type<decltype(test)>::arg<0>::type,int>::value << std::endl;
std::cout << "is mutable : " << std::is_same<stx::lambda_type<decltype(test)>::is_mutable,std::true_type>::value << std::endl;
}
}
output
[is mutable lambda]
ret type : 1
arg size : 1
arg 0 type : 1
is mutable : 1
[is normal lambda]
ret type : 1
arg size : 2
arg 0 type : 1
is mutable : 0