Шаблон оператора нижнего индекса массива C ++ - PullRequest
9 голосов
/ 31 марта 2012

Попытавшись немного облегчить доступ к классу хранилища, я попал в ситуацию, о которой у меня мало знаний. И найти людей, которые пытаются сделать то же самое, что и я, нелегко.

То, что я пытаюсь сделать, это иметь класс, который хранит массив значений в виде строк внутри, но допускает простое приведение типов с конца пользователя. То, что я планировал сделать, это использовать оператор индекса массива, чтобы возвращать тот тип, который они указывают через шаблон. Хотя это звучит намного лучше, чем работает на практике. Вот простой пример того, что я делаю, чтобы дать вам представление о том, как оно должно работать.

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

Оттуда я бы определил несколько конкретных шаблонов, и любой пользователь мог бы очень легко определить больше, если это необходимо. Но самая большая проблема с этим заключается в том, что я не знаю, как вызвать оператор индекса с шаблоном. Сначала я предположил следующее (что, по-видимому, неверно), учитывая, что это похоже на стандартный способ вызова шаблонного метода.

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

Кто-нибудь знает правильный способ вызова оператора индекса в качестве шаблона? Или я должен просто избегать этого и использовать именованный метод?

Ответы [ 2 ]

11 голосов
/ 31 марта 2012

Единственный способ позвонить вашему оператору - это явно написать 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];
4 голосов
/ 31 марта 2012

Я думаю, что нет синтаксиса для передачи параметров шаблона естественному вызову оператора []. Вам, вероятно, нужно позвонить:

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

Как и в случае с обычными шаблонными функциями, здесь нет смысла использовать перегрузку операторов.

...