0

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

ps 程序员是否总是使用“T”作为模板类数据类型?

4

4 回答 4

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
于 2013-04-20T04:50:45.253 回答
3

你可以制作一个模板:

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

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

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

当然,你也可以像其他人展示的那样做,只制作一个带有std::string. 但请注意,如果您将 c 字符串传递给它,则转换为std::string可能会导致内存分配,仅在函数结束时才被释放。

于 2013-04-20T04:59:44.437 回答
0

你不需要模板——你实际上可以使用这个:

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

由于 std::string 有一个带有 a 的构造函数const char*,因此当您编写 时mystring("hello"),您的 const char* 将使用字符串构造函数隐式转换为 std::string,然后再传递给您的类构造函数。

于 2013-04-20T04:55:10.700 回答
0

boost::string_ref 可能是您正在寻找的内容:[http://www.boost.org/doc/libs/1_53_0/libs/utility/doc/html/string_ref.html]

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

于 2013-04-20T05:01:31.780 回答