代码之家  ›  专栏  ›  技术社区  ›  Steven Venham

模板下标运算符重载[重复]

  •  1
  • Steven Venham  · 技术社区  · 7 年前

    在尝试使访问存储类变得更容易一些之后,我最终陷入了一种我不太了解的情况。而且,找到和我做同样事情的人并不容易。

    我要做的是有一个类,它在内部将值数组存储为字符串,但允许从用户端进行简单的类型转换。我计划使用array subscript操作符返回它们通过模板指定的类型。不过,这听起来比实际情况要好得多。这里有一个简单的例子,告诉你我是怎么做的 应该 工作。

    class StringList
    {
        public:
        template <typename T> 
        T operator[](const int i)
    }
    

    从这里开始,我将定义一些特定的模板,如果需要,任何用户都可以很容易地定义更多模板。但是,最大的问题是,我不知道如何用模板调用下标运算符。一开始我假设如下(显然不正确),因为它类似于调用模板方法的标准方法。

    StringList list;
    T var = list<T>[0];
    

    有人知道将下标运算符作为模板调用的正确方法吗?或者,我应该避免这样做,并使用命名方法吗?

    0 回复  |  直到 14 年前
        1
  •  11
  •   ipc    14 年前

    打电话给接线员的唯一方法就是显式地写 list.operator[]<T>() .

    有两种基本的解决方法:

    1. 编写如下的函数模板 list.get<int>() (由templatetypedef提议)
    2. 将具有自动对话的代理返回到 T .

    代码如下:

    // in the class
    struct proxy {
      proxy(StringList *list, int i) : list(list), i(i) {}
      StringList *list;
      int i;
      template <typename T>
      operator T() { return list->get<T>(i); }
    };
    
    proxy operator[](int i) { return proxy(this, i); }
    
    template <typename T> 
    T get(int i) { return ...; T(); }
    
    // how to use it:
    StringList list;
    int var = list.get<int>(0);
    float var2 = list[0];
    
        2
  •  4
  •   lvella    14 年前

    我认为没有语法可以将模板参数传递给运算符[]的自然调用。你可能需要打电话给:

    T var = list.operator[]<T>(0);
    

    就像使用普通模板函数一样,在这里使用运算符重载是没有意义的。