c/c++语言开发共享接受C ++字符串和C样式字符串的generics类

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

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

     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

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐