将模板函数和重载作为函数参数传递
Passing template function and overload as function argument
简短版本:在将函数指针作为参数传递给另一个函数时,是否可以混合模板函数和重载?
详细信息:我在模板函数中使用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;
}
相关文章:
- 如何在C++中将迭代器作为函数参数传递
- 为什么我不能将引用作为 std::async 的函数参数传递
- 节点插件 API 将数组作为函数参数传递
- 将字符串数组作为函数参数传递
- 如何通过 C++ 中的函数参数传递初始值设定项列表的固定大小的初始值设定项列表?
- 我可以动态创建新地图并作为函数参数传递吗?
- 将任意模板向量作为函数参数C++传递
- 将函数指针作为函数参数传递的目的
- C++:通过函数参数传递的值给出不同的结果
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 通过宏将函数参数传递给函数
- C++:访问作为函数参数传递的双指针数组所指向的变量的值
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将派生类构造函数参数传递给受保护的成员
- 将指向数组的指针作为函数参数传递,这本身就是另一个函数的返回值?
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何将变量作为构造函数参数或函数参数传递
- 当数组对象以函数参数传递时,为什么复制构造函数会自称