确保谓词函数在c++模板化函数中有效

Making sure a predicate function is valid in C++ templated function

本文关键字:函数 有效 c++ 谓词 确保      更新时间:2023-10-16

在编写接受谓词函数的函数时,例如下面的函数;如何确保谓词函数是有效的(即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中的类型特征设施,我发现了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" );

您可以使用:

#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");
相关文章: