接受C ++字符串&的通用类C风格的字符串

时间:2013-04-20 04:42:40

标签: c++ c string

如你所知: 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;
}

P.S。程序员总是使用'​​T'作为模板类数据类型吗?

4 个答案:

答案 0 :(得分:4)

没有必要,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

答案 1 :(得分:3)

您可以制作模板:

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

这将允许std::stringchar const*。但它也会允许其他任何碰巧有operator[]返回char的东西,或者可以转换为char的东西(例如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可能会导致内存分配,只有在函数结束时才会被释放。

答案 2 :(得分:0)

你不需要模板 - 你实际上可以使用它:

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到你的类构造函数。

答案 3 :(得分:0)

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

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