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

The*_*ski 9 c++ templates metaprogramming operator-overloading

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

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

class StringList
{
    public:
    template <typename T> 
    T operator[](const int i)
}
Run Code Online (Sandbox Code Playgroud)

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

StringList list;
T var = list<T>[0];
Run Code Online (Sandbox Code Playgroud)

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

ipc*_*ipc 11

调用运算符的唯一方法是明确写入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];
Run Code Online (Sandbox Code Playgroud)


lve*_*lla 5

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

T var = list.operator[]<T>(0);
Run Code Online (Sandbox Code Playgroud)

就像使用普通模板函数一样,因此这里没有必要使用运算符重载。