如何在<{1}}中使用模板化函数与 STL 提供的算法一起使用?
例如,此代码无法编译,因为编译器无法推导<algorithm>
函数的模板参数:
predicate
答案 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;
}
答案 4 :(得分:0)
使用static_cast
来解决过载问题:
std::copy_if( str.begin( ),
str.end( ),
std::back_inserter( result ),
static_cast<bool (*)(const char&)>(predicate) );