2012-03-31 3 views
8

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

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

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

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

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

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

+0

Я бы предостерег от перегрузки 'operator []' для этой цели, поскольку перегруженные операторы лучше всего использовать, когда они синтаксически значимы. Обычно вы не пишете «list [0]», и я думаю, что дополнительные интеллектуальные накладные расходы не стоят того. Почему бы не просто создать шаблон 'get' и вызвать' list.get (0) '? – templatetypedef

+0

@templatetypedef Я полностью согласен. Я, скорее всего, собираюсь просто придерживаться именованной функции, например get, учитывая, что даже не понимаю, как вы напишете такой шаблон. Но мне любопытно узнать, как это будет написано, независимо от того, нужно ли мне когда-либо использовать его. – TheCodeBroski

ответ

10

Единственный способ позвонить вашему оператору - явно написать 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]; 
+1

Должен признаться, я не совсем понимаю ваше прокси-решение. Не могли бы вы немного разобраться? Какова цель 'T get (int i) {return ...; Т(); } '? Как 'proxy operator [] (int i) {return proxy (this, i); } ', связанных с' StringList'? Как работает строка 'float var2 = list [0];'? Мое слабое знание передовых методов С ++ может быть причиной здесь. :-) –

4

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

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

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

Смежные вопросы