如你所知: 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'作为模板类数据类型吗?
答案 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::string
和char const*
。但它也会允许其他任何碰巧有operator[]
返回char的东西,或者可以转换为char的东西(例如std::vector<char>
或std::deque<char>
)。如果您想将其限制为std::string
和char 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接口的不可变部分。