接受C++字符串和 C 样式字符串的泛型类
Generic class that accepts C++ string & C style string
所以你知道: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;
}
注。程序员总是使用'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<typename Str_T>
char getSecondLetter(Str_T const & str) { return str[1]; }
这将允许std::string
和char const*
。但它也允许任何其他碰巧有一个返回字符的operator[]
,或可转换为字符的东西(例如: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
可能会导致内存分配,只有在函数结束时才会被释放。
您不需要模板-实际上您可以使用这个:
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*将在传递给类构造函数之前使用string构造函数隐式地转换为std::string。
boost::string_ref可能就是你要找的:[http://www.boost.org/doc/libs/1_53_0/libs/utility/doc/html/string_ref.html]
它是一个轻量级类,可以从字符串或c数组构造,并且它支持std::string接口的不可变部分。
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 如何在 C++ 中声明泛型类
- 在C++中分配泛型类
- 基于变量输入的泛型类方法计算
- C++处理取消引用语法的泛型类
- 用于重载的泛型类成员函数
- 将类型作为指向另一个类的对象的指针的泛型类-NOT WORKING
- 在泛型类中使用带有 CUDA 关键字的模板类
- 在类中使用泛型类成员
- 如何在main中重载运算符>泛型类.cpp
- C++泛型类中的字段/属性
- 用返回子类的方法设计C++泛型类
- C++ 堆栈泛型类,int 变量将 32765 作为值而不是 1
- 将资源移出泛型类
- C++中的泛型类
- 可以在泛型类中为一种类型提供一个可用的函数
- 如何在C++中从泛型类创建对象
- 用泛型类指针作为参数声明函数指针的正确语法是什么
- 接受C++字符串和 C 样式字符串的泛型类