Может ли оператор C ++ [] принимать более одного аргумента? - PullRequest
2 голосов
/ 12 августа 2011

Можно ли определить перегруженный operator[], который принимает более одного аргумента?То есть я могу определить operator[] следующим образом:

  //In some class
  double operator[](const int a, const int b){
     return big_array[a+offset*b];}

, а затем использовать его следующим образом?

double b=some_obj[7,3];

Ответы [ 7 ]

5 голосов
/ 12 августа 2011

Нет, вы не можете перегрузить operator[], чтобы принять более одного аргумента.Вместо

double b = some_obj[7,3];

используйте

double b = some_obj[7][3];

Этот ответ объясняет, как создать прокси-объект, чтобы иметь возможность последнего.

В противном случаеВы можете просто перегрузить operator(), чтобы получить 2 аргумента.

5 голосов
/ 12 августа 2011

Нет. Идиоматический способ сделать это в C ++ -

double b = some_obj[7][3];
3 голосов
/ 12 августа 2011

Нет, синтаксис C ++ говорит, что в

double b=some_obj[7,3];

запятая является оператором запятой, а не запятой, разделяющей аргументы.

2 голосов
/ 12 августа 2011

Вы можете сделать то, что предложил Андреа, или перегрузить operator(), чтобы получить два аргумента:

// In some class
double operator()(const int a, const int b) {
    return big_array[a + offset * b];
}

// Then use it like this:
double b = some_obj(7, 3);
2 голосов
/ 12 августа 2011

Итог: нет, не путайте своих пользователей.

Из C ++ FAQ :

Помните цель перегрузки оператора: снизить стоимость и процент дефектов в коде, который использует ваш класс. Если вы создаете операторы, которые запутать ваших пользователей (потому что они крутые, потому что они делают код быстрее, потому что вам нужно доказать себе, что вы можете это сделать; не имеет значения, почему), вы нарушили всю причину использования перегрузка оператора в первую очередь.

1 голос
/ 12 августа 2011

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

1 голос
/ 12 августа 2011

Лучший способ сделать это, поскольку он не блокирует вас при создании временных переменных и допускает множественные аргументы, это operator(). Более подробную информацию можно найти в C ++ FAQ .

...