假设我有一个非常复杂的缓冲区加扰函数,可以使用以下原型:
void do_something(char * thebuffer, int thelength);
假设我需要让函数在std :: string上运行。但是std :: string.c_str()返回const char *,这是不可变的。
除了创建一个新的char *缓冲区并将其传递给do_something之外,是否可以将do_something用于std :: string?
我的情况实际上是另一种方式(char *,int到std :: string& taking函数)。
或者是解决这个问题的唯一方法,就是去制作一个新的功能副本,它会做同样的事情吗? (这并不是真正的好风格)
答案 0 :(得分:5)
只要不超过
,你就可以安全地施放它 do_something((char *)mystring.c_str(), mystring.size());
或
do_something(&mystring[0], mystring.size());
或更多C++
ish
do_something(const_cast<char *>(mystring.c_str()), mystring.size());
旁注:
std::vector<char>
是缓冲区比string
更好的类型。您只需将&myvec[0]
用作char*
答案 1 :(得分:1)
你可以使它成为模板函数,然后传递一个字符串:: iterator而不是char *。或者简单地让它接受string :: iterator。如果您只使用顺序访问,则可能不需要重写函数中的任何其他内容。
void do_something(string::iterator thebuffer, int thelength);
答案 2 :(得分:0)
没有制作新功能,但是重载当前的功能,只是传递内容。
void do_something(std::vector<char>& buf){
do_something(&buf[0], buf.size());
}
在调用您的函数时,您可以免于出现乱码和麻烦的麻烦。