接受C++字符串&C风格的字符串泛型类

问题描述:

所以,当你知道: 空调风格字符串是一个字符数组,与“空”接受C++字符串&C风格的字符串泛型类

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'作为模板类的数据类型吗?

+1

定义“接受”。有没有一种'std :: string'不会为你做,你需要(在回答这个问题时,考虑一下'c_str()'成员,它允许它在外部呈现为一个以null结尾的字符串)。 ?除此之外,它必须是一个阶级/方法吗?为什么不只是一对重载功能? – WhozCraig 2013-04-20 04:48:04

+0

对不起,我不明白你的评论=(我试图实现我自己的函数/类,而不使用给定的库函数,它将接受c或cpp字符串并对字符串进行一些操作 – 2013-04-20 04:50:37

+0

@JL不,程序员并不总是使用'T',但它是标准的。 – timss 2013-04-20 04:51:47

没有必要,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 
+0

谢谢。但我已经知道c_str()方法,并不想使用它。我试图练习“泛型类”,并试图学习如何使用泛型类来接受c风格的字符串或cpp字符串,并执行诸如在索引X返回字符或大写字符等操作等。 – 2013-04-20 04:53:53

+0

更好地使用const char * c_str =“hello”'因为字符串文字不被使用'char *'。 – taocp 2013-04-20 04:53:54

+0

易失性指针'c_str'将被自尊的现代C++编译器标记为不建议使用的功能。它应该被声明为一个初始化数组或者一个'const char *'符合。 – WhozCraig 2013-04-20 04:55:02

你并不需要为这个模板 - 可以真正地使用此:

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

由于性病:: string有一个构造函数,当你编写mystring("hello")时,你的const char *在被传递给你的类构造函数之前将被使用字符串构造函数隐式转换为std :: string。

+0

避免双重结构,'常量的std :: string&input'会是一个更好的匹配,但即使如此,这使得输入,这我不相信的OP正在寻找(这并不奇怪)的副本。 – WhozCraig 2013-04-20 05:00:47

你可以做一个模板:

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

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

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

当然,你也可以做其他人已经表明,只是做一个版本,需要std::string。但请注意,如果您传递一个c字符串,转换为std::string可能会导致内存分配,只有在函数结束时才会释放内存分配。

+0

+1多用途结果是奖金,至少会让OP考虑模板如何扩展以涵盖比他首先考虑的要多的内容。很好的答案。 – WhozCraig 2013-04-20 05:04:16

+0

嗯..是的,理论上我只想要std :: string&char const *,但是如果使用了两个重载方法,我不认为该类被认为是泛型类。函数的参数已经定义了数据类型,而不是通用的。我对吗? – 2013-04-20 05:40:52

的boost :: string_ref可能是你在找什么:[http://www.boost.org/doc/libs/1_53_0/libs/utility/doc/html/string_ref.html]

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