4

我想要一个函数模板,它接受一个向量和一个元素,并返回这个元素在向量中的位置。我希望这个函数适用于 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

我该如何解决这个问题?

谢谢,拉克什。

4

2 回答 2

7

使用模板时,您永远不必检查。以预期的方式定义,所以使用它!typeidstd::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;
}
于 2013-04-24T06:32:07.760 回答
7

std::stringoperator ==但是,如果你想调用不同的方法,你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只能用于比较,因为循环是相同的。

于 2013-04-24T06:32:22.270 回答