接受C++字符串和 C 样式字符串的泛型类

Generic class that accepts C++ string & C style string

本文关键字:字符串 泛型类 样式 C++ 接受      更新时间:2023-10-16

所以你知道:C风格字符串是以"null"结尾的字符数组

c++风格字符串是:

string s = "Some text";

所以要接受c++字符串和C风格字符串,我很确定我必须使用c++模板。

我试图写一个类和一个方法,返回字符串的第二个字符为c++或C风格字符串。我的思路对吗?

template <class T>
  class mystring {
    T pointer;
  public:
    mystring(T input) { pointer = input }
    char getSecondLetter() {
      T temp = pointer;
      temp++;
      return temp;
    }
};
int main () {
  mystring<I dont know what to put> myobject("HELLO");
  cout << myobject.getSecondLetter();
  return 0;
}

注。程序员总是使用'T'模板类数据类型吗?

没有必要,C字符串隐式转换为std::string

char getSecondLetter( const std::string & s ) {
  return s[1];
}
const char *c_str = "hello";
std::string str = "world";
getSecondLetter( c_str );   // e
getSecondLetter( str );     // o

你可以制作一个模板:

template<typename Str_T>
char getSecondLetter(Str_T const & str) { return str[1]; }

这将允许std::stringchar const*。但它也允许任何其他碰巧有一个返回字符的operator[],或可转换为字符的东西(例如:std::vector<char>std::deque<char>)。如果您想将其限制为std::stringchar const*,那么您可以只写两个重载:

char getSecondLetter(std::string const & str) { return str[1]; }
char getSecondLetter(char const * str) { return str[1]; }

当然,您也可以像其他人所展示的那样,只制作一个使用std::string的版本。但是要注意,如果您向它传递一个c-string,那么转换为std::string可能会导致内存分配,只有在函数结束时才会被释放。

您不需要模板-实际上您可以使用这个:

class mystring {
    std::string str;
public:
    mystring(std::string input) : str(input) {}
    char getSecondLetter() {
        return str[1];
    }
};

由于std::string有一个以const char*为参数的构造函数,因此在编写mystring("hello")时,const char*将在传递给类构造函数之前使用string构造函数隐式地转换为std::string。

boost::string_ref可能就是你要找的:[http://www.boost.org/doc/libs/1_53_0/libs/utility/doc/html/string_ref.html]

它是一个轻量级类,可以从字符串或c数组构造,并且它支持std::string接口的不可变部分。