以模板化函数作为参数的 STL 算法

STL algorithms with templated functions as parameter

如何将 模板函数 <algorithm>STL 提供的算法一起使用? 例如,此代码无法编译,因为编译器无法推导出 predicate 函数的模板参数:

#include <iostream>
#include <algorithm>

template< typename CharType >
bool predicate( const CharType& c )
{
    return c == '0';
}

std::string
process_string( const std::string& str )
{
    std::string result;
    std::copy_if( str.begin( ),
                  str.end( ),
                  std::back_inserter( result ),
                  predicate );
    return result;
}

int main()
{
    std::cout << process_string("AK0NNDK0ASDAS0") << std::endl;
    return 0;
}

您可以提供类型:predicate<std::string::value_type>

使用static_cast解决过载问题:

std::copy_if( str.begin( ),
              str.end( ),
              std::back_inserter( result ),
              static_cast<bool (*)(const char&)>(predicate) );

几种方式:包括

  • 明确提供类型

    predicate<std::string::value_type>
    
  • 使用 lambda

    [](auto&&e) { predicate(e); }
    

模板本身不能作为函数参数。在这种情况下,您想将函数指针传递给模板函数,您必须将其实例化为 predicate<char>:

std::copy_if( str.begin( ),
              str.end( ),
              std::back_inserter( result ),
              predicate<char> );

使用带模板的实例化仿函数 operator():

namespace detail {

struct predicateFunctor {
    template<typename CharType>
    bool operator()(const CharType& c)
    {
        return c == '0';
    }
};

} /*namespace detail*/

static auto predicate = detail::predicateFunctor{};

std::string process_string(const std::string& str)
{
    std::string result;
    std::copy_if(str.begin(), str.end(), std::back_inserter(result), predicate);
    return result;
}


int main()
{
    std::cout << process_string("AK0NNDK0ASDAS0") << std::endl;
    return 0;
}

Demo