C++ StringPiece是否与字符串右值引用冲突?
我在一些开源项目中见过StringPiece类,比如muduo网络库和pcre。实现StringPiece类如下所示:C++ StringPiece是否与字符串右值引用冲突?,c++,string,c++11,C++,String,C++11,我在一些开源项目中见过StringPiece类,比如muduo网络库和pcre。实现StringPiece类如下所示: // You can use StringPiece as a function or method parameter. A StringPiece // parameter can receive a double-quoted std::string literal argument, a “const // char*” argument, a std::string
// You can use StringPiece as a function or method parameter. A StringPiece
// parameter can receive a double-quoted std::string literal argument, a “const
// char*” argument, a std::string argument, or a StringPiece argument with no
// data copying. Systematic use of StringPiece for arguments reduces data
// copies and strlen() calls.
class StringPiece {
public:
StringPiece() : ptr_(nullptr), length_(0) {}
StringPiece(const char* str) : ptr_(str), length_(strlen(str)) {}
StringPiece(const unsigned char* str)
: ptr_(reinterpret_cast<const char*>(str)), length_(strlen(ptr_)) {}
StringPiece(const std::string& str)
: ptr_(str.c_str()), length_(str.size()) {}
StringPiece(const char* offset, int len) : ptr_(offset), length_(len) {}
const char* data() const { return ptr_; }
size_t size() const { return length_; }
bool empty() const { return length_ == 0; }
const char* begin() const { return ptr_; }
const char* end() const { return ptr_ + length_; }
void clear() {
ptr_ = nullptr;
length_ = 0;
}
void set(const char* buf, size_t len) {
ptr_ = buf;
length_ = len;
}
void set(const char* buf) {
ptr_ = buf;
length_ = strlen(ptr_);
}
void set(const void* buf) {
ptr_ = static_cast<const char*>(buf);
length_ = strlen(ptr_);
}
void remove_prefix(size_t n) {
assert(n < length_);
ptr_ += n;
length_ -= n;
}
void remove_suffix(size_t n) {
assert(n < length_);
length_ -= n;
}
char operator[](size_t i) const { return ptr_[i]; }
bool operator==(const StringPiece& str) const {
return ((str.length_ == length_) && (memcmp(ptr_, str.ptr_, length_) == 0));
}
bool operator!=(const StringPiece& str) const { return !(*this == str); }
std::string as_string() const { return std::string(ptr_, length_); }
bool start_with(const StringPiece& str) const {
return (length_ >= str.length_) &&
(0 == memcmp(ptr_, str.ptr_, str.length_));
}
#define STRINGPIECE_BINARY_PREDICATE(cmp, auxcmp) \
bool operator cmp(const StringPiece& str) const { \
int r = \
memcmp(ptr_, str.ptr_, length_ < str.length_ ? length_ : str.length_); \
return ((r auxcmp 0)) || ((0 == r) && (length_ cmp str.length_)); \
}
STRINGPIECE_BINARY_PREDICATE(<, <)
STRINGPIECE_BINARY_PREDICATE(<=, <)
STRINGPIECE_BINARY_PREDICATE(>, >)
STRINGPIECE_BINARY_PREDICATE(>=, >)
#undef STRINGPIECE_BINARY_PREDICATE
int compare(const StringPiece& str) {
int r =
memcmp(ptr_, str.ptr_, length_ < str.length_ ? length_ : str.length_);
if (0 == r) {
if (length_ < str.length_)
r = -1;
else if (length_ > str.length_)
r = 1;
}
return r;
}
private:
const char* ptr_;
size_t length_;
};
//您可以将StringPiece用作函数或方法参数。细绳
//参数可以接收双引号的std::string文本参数,即“const”
//char*”参数、std::string参数或不带
//数据复制。系统地使用StringPiece作为参数可减少数据量
//复制和strlen()调用。
类桁条{
公众:
StringPiece():ptr_u3;(nullptr),长度_3;(0){}
StringPiece(const char*str):ptr_(str),length_(strlen(str)){}
StringPiece(常量无符号字符*str)
:ptr_(reinterpret_cast(str)),length_(strlen(ptr_)){}
StringPiece(const std::string和str)
:ptr_(str.c_str()),length_(str.size()){}
StringPiece(const char*offset,int len):ptr_(offset),length_(len){
const char*data()const{return ptr}
size_t size()常量{返回长度}
bool empty()常量{返回长度==0;}
常量char*begin()常量{return ptr}
const char*end()const{return ptr_+length_;}
无效清除(){
ptr=空ptr;
长度=0;
}
无效集(常量字符*buf,大小长度){
ptr=buf;
长度=len;
}
无效集(常量字符*buf){
ptr=buf;
长度=strlen(ptr);
}
无效集(常量无效*buf){
ptr=静态铸件(buf);
长度=strlen(ptr);
}
无效删除前缀(大小){
assert(n长度)
r=1;
}
返回r;
}
私人:
常量字符*ptr_2;;
尺寸与长度;
};
如上所述,StringPiece的设计目的是1)保存一些不必要的数据复制,2)在一个对象中接收两个不同的类型参数。
我写了一些代码来学习如何使用StringPiece,我遇到了一些错误。我的代码如下:
#include "StringPiece.h"
#include <iostream>
using namespace std;
void foo1(string&& str){
cout << str << endl;
}
void foo1(const StringPiece& str){
cout << str.as_string() << endl;
}
int main(void){
foo1("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
return 0;
}
#包括“StringPiece.h”
#包括
使用名称空间std;
void foo1(字符串和str){
可能不能只使用std::string\u view
?添加StringPiece&
重载将没有帮助。您需要添加const char*
重载。或者,重新删除除const StringPiece&
或StringPiece
之外的所有重载(按值)谢谢你的回答。但是“重新爱”是什么意思?删除。对不起,输入错误