C++重载字符串 [] 运算符以返回字符串和
Overload string [] operator in C++ to return string&
我正在重写一个字符串类(称为XXXString),它实现了许多Pythonic操作,如==
。 当重载[]
运算符时,我希望它返回一个XXXString&到它的第i
个字符,而不是像std::string
中的char&那样。 这样,我可以同时做到这两点
a_string[0] = "a"
和
a_string[0] == "a"
(假设我已经定义了==
运算符来比较 XXXString 和char*
)。 我知道很多C++热情的人会说不,你的"a"
不是'a'
。那里有一只' '
巴拉巴拉。我只想忽略这一点,并考虑Pythonic。
如果你真的想这样做,解决方案应该是使用代理,而不是返回实际的XXXString
本身。
#include <iostream>
#include <string>
#include <cassert>
class XXXString {
public:
class StringRefProxy {
public:
StringRefProxy(char& ch_in) : ch{ch_in} {}
bool operator==(const std::string& other) {
assert(other.length() == 1);
return other[0] == this->ch;
}
StringRefProxy& operator=(const std::string& other) {
assert(other.length() == 1);
this->ch = other[0];
return *this;
}
private:
char& ch;
};
XXXString(const std::string& str_in) : str{str_in} {}
StringRefProxy operator[](std::size_t index) {
return StringRefProxy{this->str[index]};
}
operator std::string() {
return this->str;
}
private:
std::string str;
};
int main() {
auto str = XXXString{"something"};
assert(str[0] == "s");
str[0] = "a";
assert(static_cast<std::string>(str) == "aomething");
}
请注意,当 C++17 免费可用时,您可以将上述代码中的所有const std::string&
替换为std::string_view
以获得更好的性能
另请注意,随着大多数方法的发展,提取指向容器内元素的引用。 这也存在无效问题。
相关文章:
- C 字符串返回字符串的整数/双精度/长整型值
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- Java 调用 dll 字符串返回类型方法
- 返回具有C++字符串返回值的函数的本地 C 字符串
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 尝试以随机字符(长读取)打印字符串返回结果
- 从字符串返回 i(索引)字
- 函数读取最大和min int值,并用文本字符串返回
- 如何将 YAML 节点中的序列作为字符串返回?
- 将注册表项读取为字符串返回数值
- 为什么我在尝试打印字符串返回时收到编译器错误?
- 使用 char*array 存储条形图的条形图,以便我可以动态制作它并作为字符串返回
- 字符串返回功能不起作用 - 'identifier is underfined'
- 将C 本地字符串返回到另一个功能
- 在MATLAB中仅接受INT32PTR时,将错误编号作为字符串返回
- 字符串流到字符串返回
- 字符串返回错误的长度
- 从共享指针矢量字符串返回值
- C++随机字符串返回意外结果
- 临时标准::字符串返回垃圾