我正在复习我的 C++,并希望实现一个基于 Scott Meyer 的“更有效的 C++”第 30 条的概念。问题是在使用具有自定义数据结构的下标运算符时区分读取和写入。
所以我正在试验的是创建一个如下使用的模板:
map<int> im;
im["foo"] = 69;
cout << im["foo"] << endl; // outputs 69
im["bar"] = im["foo"];
我想出了这样的东西,在类中有一个 STL 映射用于存储数据并创建一个 Helper 代理类来处理处理下标的东西。
#include <iostream>
#include <map>
using std::string;
namespace mymap {
template <typename T> class map
{
private:
std::map<string,T> container;
public:
class Helper {
map& m;
string key;
Helper (map& mm, string kkey): m(mm), key(kkey) {};
public:
operator T() const // rvalue use
{
std::cout << "op char()" << std::endl;
return m.container[key];
}
Helper& operator=(T i) // lvalue use
{
m.container[key] = i;
return *this;
}
Helper& operator=(const Helper& rhs) // lvalue use
{
m.container[key] = rhs.m.container[rhs.key];
return *this;
}
};
const Helper operator[]( string key) const // for const maps
{
return Helper(const_cast<map&>(*this), key);
}
Helper operator[](string key) // for non-const maps
{
return Helper(*this, key);
}
friend class Helper;
};
} // mymap namespace
虽然它是为指令而构建的
using namespace mymap;
using mymap::map;
using std::cout;
int main(void)
{
map<int> im;
}
在 main() 中,但我试图完成的任何其他东西都会破坏构建。您能否告诉我是否有什么重要的事情我搞砸了,以及如何解决?
正如我首先看到的那样,它可能是模板结构:
error: ‘mymap::map<T>::Helper::Helper(mymap::map<T>&, std::string) [with T = int, mymap::map<T> = mymap::map<int>, std::string = std::basic_string<char>]’ is private
我在Two array subscript overloading to read and write看到了一个类似的设计概念,但是我愿意在这个中尝试 Meyer 的方法。