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

时间:2016-04-22 11:29:26

标签: c++ c++11 stl-algorithm template-function

如何在<{1}}中使用模板化函数 STL 提供的算法一起使用? 例如,此代码无法编译,因为编译器无法推导<algorithm>函数的模板参数:

predicate

5 个答案:

答案 0 :(得分:6)

有几种方式:包括

  • 明确提供类型

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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;
}

Demo

答案 4 :(得分:0)

使用static_cast来解决过载问题:

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