LoginSignup
3
3

More than 5 years have passed since last update.

template引数の関数オブジェクトの戻り値を取得する

Posted at

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 );
}

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3