0

如何使用模板化函数STL提供的算法<algorithm>?例如,此代码无法编译,因为编译器无法推断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;
}
4

5 回答 5

6

几种方式:包括

  • 明确提供类型

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

    [](auto&&e) { predicate(e); }
    
于 2016-04-22T11:38:50.147 回答
5

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

于 2016-04-22T11:35:07.830 回答
1

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

std::copy_if( str.begin( ),
              str.end( ),
              std::back_inserter( result ),
              predicate<char> );
于 2016-04-22T11:43:13.977 回答
1

使用带有模板的实例化仿函数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;
}

演示

于 2016-04-22T11:45:47.487 回答
0

用于static_cast解决过载问题:

std::copy_if( str.begin( ),
              str.end( ),
              std::back_inserter( result ),
              static_cast<bool (*)(const char&)>(predicate) );
于 2016-04-22T11:36:44.877 回答