如您所知: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::string
和char const*
。 但它也会允许其他任何碰巧有一个operator[]
返回char,或者可转换为char的东西(例如std::vector
或std::deque
)。 如果你想将它限制为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
可能会导致内存分配,只有在函数结束时才会释放。
你不需要模板 – 你实际上可以使用它:
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可能就是你要找的东西:[https://www.boost.org/doc/libs/1_53_0/libs/utility/doc/html/string_ref.html]
它是一个可以从字符串或c数组构造的轻量级类,它支持std :: string接口的不可变部分。
以上就是c/c++开发分享接受C ++字符串和C样式字符串的generics类相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/518863.html