我想要一个函数模板,它接受一个向量和一个元素,并返回该元素在向量中的位置.我希望这个函数适用于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;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我最初检查类型,以便我可以使用适当的比较方法.当我使用std :: string类型参数调用时,这工作正常,但当我使用double类型时,它会出现以下错误:
error C2228: left of '.compare' must have class/struct/union
Run Code Online (Sandbox Code Playgroud)
和
see reference to function template instantiation 'int findElement<double>(const std::vector<_Ty> &,const T &)' being compiled
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
谢谢,拉克什.
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;
}
Run Code Online (Sandbox Code Playgroud)
另外,你function overloading只能用于比较,因为循环是相同的.
您永远不必检查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;
}
Run Code Online (Sandbox Code Playgroud)
通常,如果您需要特殊情况下特定类型的模板化函数,请使用模板特化:
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;
}
Run Code Online (Sandbox Code Playgroud)