模板函数重载。了解字符

时间:2019-06-06 09:34:58

标签: c++ templates overriding

我有一个比较夫妇值的简单代码。我正在使用模板函数来减少代码量,所以我两次重载了函数(针对不同情况)。

    //cmp.h
        template <class T>
        bool cmp(T x,T y)
        {
           if(x == y)
           { 
           return true;
           }else
           return false;
        }

        template <class T>
bool cmp(T *x,T *y)
{
   if(*x==*y)
   { return true;}else
   return false;
}


        //main.cpp  
        #include <iostream>
        #include <string>
        #include "cmp.h"
        using std::cout;
        using std::endl;
        using std::string;
        int main() {
             int aInt = 1, bInt = 2;
             double aDouble = 3.0, bDouble = 3.0;
             char aChars[5] = "haha", bChars[5] = "hahb";
             char taChars[6] = "trick", tbChars[6] = "trick";
             string aStr = "haha", bStr = "aha";
             int* aIntPtr = &aInt, *bIntPtr = &bInt;
              cout << cmp(aInt, bInt)<< endl;
             cout << cmp(aDouble, bDouble)<< endl;
              cout << cmp(aChars, bChars)<< endl;//i can't figure out why char prints out true here ???
             cout << cmp(taChars, tbChars)<< endl;
             cout << cmp(aStr, bStr)<< endl;
             cout << cmp(aIntPtr, bIntPtr)<< endl;
             cout << cmp(&aDouble, &bDouble) << endl;
             return 0;
        }  
  

我的输出是:
      0
      1
      1
      1
      0
      0
      1
  我希望
      0
      1
      0
      1
      0
      0
      1

为什么显示两个字符串相同?为什么如果我完全改变这个词,让我们说

char aChars[5] = "jack", bChars[5] = "hahb";  

然后只有它给出正确的结果。我的第二个重载函数不应该处理这个问题吗? (bool cmp(T *x,T *y)

2 个答案:

答案 0 :(得分:3)

  

为什么显示两个字符串相同?

因为

template <class T>
bool cmp(T *x,T *y)
{
   if(*x == *y)
   { 
   return true;
   }else
   return false;
}  

仅检查xy所指向的第一值。

所以当您检查

 char aChars[5] = "haha", bChars[5] = "hahb";

 cout << cmp(aChars, bChars)<< endl;//

检查h是否等于h

如果要检查字符串之间的相等性(并且如果要避免使用旧的std::strcmp()),则必须检查所有个字符,直到第一个零为止。

但是对于旧式C弦来说确实如此;我认为开发一个检查通用类型T的指针之间是否相等的函数不是一个好主意。

-编辑-

  

你能指导我吗

举个例子...很多时候我都不会在纯C语言中使用,但是如下所示应该可以工作

bool cmp (char const * p1, char const * p2)
 {
   for ( ; *p1 && *p1 == *p2 ; ++p1, ++p2 )
    ;

   return *p1 == *p2;
 }

关闭主题:您将代码编写为

bool cmp(T *x,T *y)
{
   if(*x==*y)
   { return true;}else
   return false;
}

等效于

bool cmp(T *x,T *y)
 { return *x == *y; }

更笼统地说...如果您输入的代码类型

if ( someTest )
   return true;
else
   return false;

函数返回一个bool(或someTest类型为bool),您可以编写(并且恕我直言,它更具可读性和优美性)

return someTest;

答案 1 :(得分:1)

  

为什么显示两个字符串相同?

数组会衰减到指针,因此char taChars[6]将使用重载template <class T> bool cmp(T *x,T *y),因此仅比较第一个元素(在您的情况下相等)。

在C ++ 17中,您可以这样做:

template <typename T>
bool cmp(const T& lhs, const T& rhs)
{
    if constexpr (std::is_pointer<T>::value) {
        return *lhs == *rhs;
    } else if constexpr (std::is_array<T>::value) {
        return std::equal(std::begin(lhs), std::end(lhs), std::begin(rhs), std::end(rhs));
    } else {
        return lhs == rhs;
    }
}

Demo