模板中的代理类用于下标运算符重载

时间:2013-09-20 04:37:53

标签: c++ templates operator-overloading

我正在刷新我的C ++,并希望实现一个基于Scott Meyer的“更有效的C ++”第30项的概念。当使用带有自定义数据结构的下标运算符时,就是要区分读写。 / p>

所以我正在尝试的是创建一个模板,如下所示:

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的方法。

0 个答案:

没有答案