1

以下のような述語関数を受け入れる関数を書くとき。述語関数が有効であること (つまり、戻り値の型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" );

しかし、どちらも私には正しく見えません。

4

1 に答える 1

1

あなたが使用することができます:

#include <utility> // For std::declval<>()

static_assert(
    std::is_convertible<decltype(func(std::declval<SomeType>())), bool>::value,
    "Predicate's return type must be convertible to bool");

タイプしかない場合、Predicateまたは式で使用したくない場合func

static_assert(
    std::is_convertible<
        decltype(std::declval<Predicate&>()(std::declval<SomeType>())),
        bool>::value,
    "Predicate's return type must be convertible to bool");
于 2013-06-03T13:51:37.423 に答える