C++ 使一个在旧C字符串(char*,int)上工作的函数在std::string&;
假设我有一个非常复杂的缓冲区置乱函数,它对以下原型执行某些操作:C++ 使一个在旧C字符串(char*,int)上工作的函数在std::string&;,c++,coding-style,C++,Coding Style,假设我有一个非常复杂的缓冲区置乱函数,它对以下原型执行某些操作: void do_something(char * thebuffer, int thelength); 假设我需要让函数处理std::string。但是std::string.c_str()返回常量char*,它是不可变的 除了创建一个新的char*缓冲区并将其传递给do_something之外,还可以对std::string使用do_something吗 我的情况实际上是另一种情况(将char*,int转换成std::stri
void do_something(char * thebuffer, int thelength);
假设我需要让函数处理std::string。但是std::string.c_str()返回常量char*,它是不可变的
除了创建一个新的char*缓冲区并将其传递给do_something之外,还可以对std::string使用do_something吗
我的情况实际上是另一种情况(将char*,int转换成std::string&taking函数)
或者是唯一的解决方法,就是制作一个新的函数副本,它做同样的事情?(这不是很好的风格)你可以安全地投下它,只要它不超过这个尺寸
dou_something((char*)mystring.c_str(),mystring.size())代码>
或
dou_something(&mystring[0],mystring.size())代码>
或更多C++
ish
do_something(const_cast(mystring.c_str()),mystring.size())代码>
旁注:
std::vector
是比字符串更好的缓冲区类型。而不仅仅是将&myvec[0]
用作char*
只要不超过大小,就可以安全地将其强制转换
dou_something((char*)mystring.c_str(),mystring.size())代码>
或
dou_something(&mystring[0],mystring.size())代码>
或更多C++
ish
do_something(const_cast(mystring.c_str()),mystring.size())代码>
旁注:
std::vector
是比字符串更好的缓冲区类型。而不是将&myvec[0]
用作char*
您可以将其作为模板函数,然后将其传递给string::iterator而不是char*。或者简单地让它接受string::iterator。如果只使用顺序访问,则可能不需要重写函数中的任何其他内容
void do_something(string::iterator thebuffer, int thelength);
您可以将其设置为模板函数,然后向其传递字符串::迭代器而不是char*。或者简单地让它接受string::iterator。如果只使用顺序访问,则可能不需要重写函数中的任何其他内容
void do_something(string::iterator thebuffer, int thelength);
不是创建一个新函数,而是重载当前函数,只是传递一些内容
void do_something(std::vector<char>& buf){
do_something(&buf[0], buf.size());
}
void do_某事(std::vector&buf){
做某事(&buf[0],buf.size());
}
在调用函数时,避免了施放和其他操作的麻烦。不创建新函数,而是重载当前函数,只需传递内容即可
void do_something(string::iterator thebuffer, int thelength);
void do_something(std::vector<char>& buf){
do_something(&buf[0], buf.size());
}
void do_某事(std::vector&buf){
做某事(&buf[0],buf.size());
}
在调用函数时避免了强制转换和其他操作的麻烦。小心点,就像在C++03中一样,std::string类不需要使用连续内存来表示()。希望它是在C++0x()@Drahakar中实现的,但是没有其他(合理的)方法来实现它。它必须能够返回c_str();至少使用C++的CAST(COSTRACCAST),也不能缩小大小。如果我们假设连续的内存,那么<代码>和STR(0)< /代码>也应该是一个字符串。请小心,如在C++ 03中,STD::String类不需要使用连续的内存来表示()。希望它是在C++0x()@Drahakar中实现的,但是没有其他(合理的)方法来实现它。它必须能够返回c_str();至少使用C++的CaskCask(CistaScCupe),你也不能缩小大小。如果我们假设连续的内存,那么<代码>和STR(0)< /代码>也可以是一个字符串。你的字符串有多大?为什么不复制呢?旁注:std::vector
对于缓冲区来说比字符串更好。而不仅仅是将&myvec[0]
用作char*
(这不是很好的风格)–一个重载可以用另一个重载实现,你不应该复制代码本身。你的字符串有多大?为什么不复制呢?旁注:std::vector
对于缓冲区来说比字符串更好。而不仅仅是将&myvec[0]
用作char*
(这并不是很好的风格)–一个重载可以在另一个重载中实现,您不应该复制代码本身。
void do_something(string::iterator thebuffer, int thelength);