在C ++中重载string []运算符以返回字符串&

时间:2017-07-04 19:01:53

标签: python c++ string

我正在重写一个字符串类(称为XXXString),它实现了许多Pythonic操作,如==。 当重载[]运算符时,我希望它返回一个XXXString&到它的i字符,而不是char&就像std::string一样。 通过这种方式,我可以做到这两点

a_string[0] = "a"

a_string[0] == "a"

(假设我已经定义了==运算符来比较XXXString和char*)。 我知道很多C ++热心的人会说你的"a"不是'a'。巴拉巴拉有一个'\0'。我只是想忽略这一点并想想Pythonic。

1 个答案:

答案 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以获得更好的性能

另请注意,大多数方法都是提取指向容器内元素的引用。这也受到无效问题的影响。