将模板函数和重载作为函数参数传递

Passing template function and overload as function argument

本文关键字:函数 参数传递 重载      更新时间:2023-10-16

简短版本:在将函数指针作为参数传递给另一个函数时,是否可以混合模板函数和重载?

详细信息:我在模板函数中使用std::search,我想根据模板的类型控制使用哪个函数进行比较,例如,对于char*,使用调用strcmp的函数,对于其他类型,使用operator==的函数。

到目前为止,我正在使用一个模板函子,专门用于char*,如下所示:

Comparator<T> comparator;
std::search(....., comparator);

也就是说,不存在模板函数的模板专用化,因为它们只是简单的重载。那么,在这种情况下,我是不是被函子卡住了?

函数模板没有部分专门化。但我认为你可能有一个更大的误解:"在传递函数指针时,可以混合模板函数和重载……"重载解决方案发生在创建函数指针时。一旦创建了函数指针,就不再有混合了。

也就是说,你似乎想要的是政策。我知道,当你不知道名字的时候,很难用谷歌搜索。

具有完整模板专业化的解决方案:

#include <string.h>
#include <vector>
#include <algorithm>
// template function "MyComperator"
template<class T>
bool MyComperator( T a, T b ) {
    return a < b;
}
// full template specialization for function "MyComperator" with type "char*"
template<>
bool MyComperator<char*>( char *a, char *b ) {
    return strcmp( a, b ) < 0;
}
int main() {
    std::vector<int> v1;
    v1.push_back( 3 );
    v1.push_back( 2 );
    v1.push_back( 1 );
    std::sort( v1.begin(), v1.end(), &MyComperator<int> );
    std::vector<char*> v2;
    v2.push_back( "C" );
    v2.push_back( "B" );
    v2.push_back( "A" );
    std::sort( v2.begin(), v2.end(), &MyComperator<char*> );
    return 0;
}