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 に答える