以模板化函数作为参数的 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;
}
如何将 模板函数 与 <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;
}