C++重载字符串 [] 运算符以返回字符串和

Overload string [] operator in C++ to return string&

本文关键字:字符串 返回 运算符 重载 C++      更新时间:2023-10-16

我正在重写一个字符串类(称为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以获得更好的性能

另请注意,随着大多数方法的发展,提取指向容器内元素的引用。 这也存在无效问题。