我正在重写一个字符串类(称为XXXString),它实现了许多Pythonic操作,如==
。
当重载[]
运算符时,我希望它返回一个XXXString&到它的i
字符,而不是char&就像std::string
一样。
通过这种方式,我可以做到这两点
a_string[0] = "a"
和
a_string[0] == "a"
(假设我已经定义了==
运算符来比较XXXString和char*
)。
我知道很多C ++热心的人会说你的"a"
不是'a'
。巴拉巴拉有一个'\0'
。我只是想忽略这一点并想想Pythonic。
答案 0 :(得分:1)
如果真的想要这样做,解决方案应该是使用代理而不是返回实际的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
以获得更好的性能
另请注意,大多数方法都是提取指向容器内元素的引用。这也受到无效问题的影响。