0

ご存知のように、C スタイルの文字列は「null」で終わる文字配列です。

C++ スタイルの文字列は次のとおりです。

string s = "Some text";

したがって、C++ 文字列と C スタイル文字列の両方を受け入れるには、C++ テンプレートを使用する必要があると確信しています。

C++ または C スタイルの文字列の文字列の 2 番目の文字を返すクラスとメソッドを作成しようとしています。私は正しい軌道に乗っていますか?

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::stringこれにより、との両方が許可されchar const*ます。operator[]しかし、たまたまchar を返す や、char に変換可能なもの ( std::vector<char>、 、 など)を持つものもすべて許可されますstd::deque<char>std::stringとのみに制限したい場合はchar const*、2 つのオーバーロードを記述できます。

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

もちろん、他の人が示したように行うこともできますstd::string。ただし、c-string を渡すと、への変換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 には , を取るコンストラクタがある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 に答える