templateに(ラムダ式)を渡す際にハマったのでメモ
meta_function.h
#include <type_traits>
struct result_of_type_impl
{
// ①関数
template < class Result, class ... Args >
static Result Func( Result( *)( Args ... ) );
// ②メンバ関数ポインタ(非const版)
template < class T, class Result, class ... Args >
static Result Func( Result( T::* )( Args ... ) );
// ③メンバ関数ポインタ(const版)
template < class T, class Result, class ... Args >
static Result Func( Result( T::* )( Args ... ) const );
// ④関数オブジェクト
template < class T, class FuncType = decltype( &T::operator() ) >
static decltype( Func( std::declval<FuncType>() ) ) Func( T* );
};
template < class T > struct result_of
{
using type = decltype( result_of_type_impl::Func( std::declval<std::remove_pointer_t<T>*>() ) );
};
上記メタ関数を使って関数・メンバ関数ポインタ・ラムダ式の戻り値の型が取得出来る
下は使用する際のサンプル
test1.cpp
template< class Func, class Result = result_of<Func>::type >
Result Test( Func&& func );
int main()
{
const auto func = [](){ return 0; };
Test( func );
}