c++中string和int的函数模板
Function template for string and int in C++
我想有一个函数模板,它接受一个向量和一个元素,并返回这个元素在向量中的位置。我希望这个函数同时适用于int和std::string类型。这是函数模板定义:
template<class T>
int findElement(const vector<T> &vec, const T &ele)
{
for(size_t i = 0; i < vec.size(); i++)
{
if(typeid(ele) == typeid(std::string))
{
if(ele.compare(vec[i]) == 0)
return i;
}
else
{
if(ele == vec[i])
return i;
}
}
return -1;
}
正如您所看到的,我最初检查的是类型,以便可以使用适当的比较方法。当我使用std::string类型的参数调用时,它可以正常工作,但是当我使用double类型时,它会给出以下错误:
error C2228: left of '.compare' must have class/struct/union
和
see reference to function template instantiation 'int findElement<double>(const std::vector<_Ty> &,const T &)' being compiled
如何解决这个问题?
谢谢,拉克什。
在使用模板时,永远不要检查typeid
。std::string
以预期的方式定义==
,所以使用它!
template<class T>
int findElement(const vector<T> &vec, const T &ele)
{
for(size_t i = 0; i < vec.size(); i++)
{
if(ele == vec[i])
return i;
}
return -1;
}
一般来说,如果您需要为特定类型的模板化函数进行特殊处理,请使用模板专门化:
template<class T>
int findElement(const vector<T> &vec, const T &ele) {
for(size_t i = 0; i < vec.size(); i++) {
if(ele == vec[i])
return i;
return -1;
}
template<>
int findElement<std::string>(const vector<std::string> &vec, const std::string &ele) {
for(size_t i = 0; i < vec.size(); i++) {
if(ele.compare(vec[i]) == 0)
return i;
}
return -1;
}
std::string
有operator ==
,但是,如果你想从T
调用不同的方法-你应该专门化,或者重载函数。Typeid
没有帮助,因为它是运行时类型标识。
重载示例
template<class T>
int findElement(const vector<T> &vec, const T &ele)
{
for(size_t i = 0; i < vec.size(); i++)
{
if(ele == vec[i])
return i;
}
return -1;
}
int findElement(const vector<string>& vec, const string& ele)
{
for (size_t i = 0; i < vec.size(); ++i)
{
if (ele.compare(vec[i]) == 0)
return i;
}
return -1;
}
同样,您可以使用function overloading
仅用于比较,因为循环是相同的。
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 将重载的成员函数传递给函数模板
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 具有常量引用参数的函数模板专用化
- std::span<const T> 作为函数模板中的参数
- 如何编写一个完美的缩写函数模板?
- 仅在函数模板中为那些定义了函数的类型执行函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 以下代码中的函数模板有什么问题?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将显式实例化的函数模板与转换匹配
- 这个模板<int ...>的想法C++可能吗?
- 使用定义函数模板别名
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)
- 错误:函数模板无法将 从 'int' 转换为 'double'
- C++11 std::begin 不适用于传递给模板函数的 int[]
- c++中string和int的函数模板
- sizeof 和函数模板:sizeof(&f) vs sizeof(&f<int>)
- c++函数模板,Int形参问题