C ++数组下标运算符模板

时间:2012-03-31 17:07:27

标签: c++ templates operator-overloading metaprogramming

在尝试更轻松地访问存储类之后,我最终遇到了一些我不太了解的情况。并且,找到那些试图与我做同样事情的人并不容易。

我正在尝试做的是,有一个类在内部存储一个值数组作为字符串,但允许从用户端进行简单的类型转换。我计划做的是使用数组下标运算符返回他们通过模板指定的任何类型。虽然,它听起来比它在实践中的效果好很多。这是我正在做的一个简单示例,让您了解 应该如何工作。

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

从那里,我将定义一些特定的模板,任何用户都可以根据需要轻松定义更多。但是,最大的问题是,我不知道如何使用模板调用下标运算符。起初我假设了以下(显然不正确),认为它类似于调用模板方法的标准方法。

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

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

2 个答案:

答案 0 :(得分:11)

调用您的运营商的唯一方法是明确撰写list.operator[]<T>()

有两种基本方法:

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

    // 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];
    

答案 1 :(得分:4)

我认为没有语法将模板参数传递给operator []的自然调用。您可能需要致电:

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

就像使用普通模板函数一样,所以在这里使用运算符重载毫无意义。