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

如您所知:C样式字符串是一个以“null”结尾的字符数组

C ++样式字符串是:

string s = "Some text"; 

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

我正在尝试编写一个类和一个方法,它返回C ++或C样式字符串的字符串的第二个字符。 我是在正确的轨道上吗?

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

ps程序员总是使用’​​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 char getSecondLetter(Str_T const & str) { return str[1]; } 

这将允许std::stringchar const* 。 但它也会允许其他任何碰巧有一个operator[]返回char,或者可转换为char的东西(例如std::vectorstd::deque )。 如果你想将它限制为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 *会在传递给你的类构造函数之前使用字符串构造函数隐式转换为std :: string。 。

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

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