以下のような述語関数を受け入れる関数を書くとき。述語関数が有効であること (つまり、戻り値の型operator()
が有効であること) をどのように確認できますか?
template <typename Predicate>
std::vector<SomeType> SearchList( Predicate func )
{
std::vector<SomeType> vecResults;
for( const auto& someObj : someTypeList )
{
if( func( someObj ) )
vecResults.emplace_back( someObj );
}
return vecResults;
}
C++11 の type-traits 機能を見回したところ、 からへstd::is_convertible<From,To>
の適切な暗黙的な変換があることを確認するためにそれを使用する方法がわかりませんが、それが役立つように見えるを発見しました。私が考えることができたのは、次のことだけでした。operator()
bool
static_assert( std::is_convertible<Predicate(SomeType), bool>::value, "Predicate type must be convertible to bool" );
または:
static_assert( std::is_convertible<Predicate::operator()(SomeType), bool>::value, "Predicate type must be convertible to bool" );
しかし、どちらも私には正しく見えません。