これは、問題を少なくとも再利用できるような形で専用のラッパーに移す試みです。
正確性がわからないため、一度もコンパイルを試みていません。少なくとも、 はstatic_cast
値で返すときに不要なコピーを作成します。
私は好奇心からこれを行っているだけで、実際にはこの問題の解決策は必要ありませんが、かなり面倒に見えます。
template< typename ftor, typename ... args >
typename std::enable_if< ! std::is_void< typename std::result_of< ftor( args ... ) >::type >::value,
typename std::result_of< ftor( args ... ) >::type >::type
call_or_wrap_void( ftor && f, args && ... a )
{ return std::forward< ftor >( f ) ( std::forward< args >( a ) ... ); }
struct void_wrapper {};
template< typename ftor, typename ... args >
typename std::enable_if< std::is_void< typename std::result_of< ftor( args ... ) >::type >::value,
void_wrapper >::type
call_or_wrap_void( ftor && f, args && ... a ) {
std::forward< ftor >( f ) ( std::forward< args >( a ) ... );
return {};
}
template< typename ftor, typename ... args >
typename std::result_of< ftor( args ... ) >::type
call_and_report( ftor && f, args && ... a ) {
auto && ret{ call_or_wrap_void( std::forward< ftor >( f ), std::forward< args >( a ) ... ) };
std::cout << "Done!\n";
return static_cast< typename std::result_of< ftor( args ... ) >::type >
( std::move( ret ) );
}