В C (или C++) можно создать массив a
(или что-то похожее на "массив"), так что a[0]
, a[1]
и т.д. Все указывают на одну и ту же память место нахождения? Так что если вы это сделаете
a[0] = 0.0f;
a[1] += 1.0f;
то a[0]
будет равно 1.0f
, так как это то же место памяти, что a[1]
.
У меня есть причина для этого. Вероятно, это не очень хорошая причина. Поэтому, пожалуйста, рассматривайте этот вопрос так, как если бы его попросили чисто из любопытства.
Я должен был сказать: я хочу сделать это без перегрузки оператора []. Причина этого заключается в том, чтобы избежать динамической отправки. (Я уже сказал, что моя причина для желания сделать это, вероятно, не очень хорошая. Мне не нужно говорить мне, что я не хочу этого делать. Я уже это знаю.)
Я полагаю, что такой класс нужен вам
template <typename T>
struct strange_array
{
T & operator [] (int) { return value; }
private:
T value;
};
value
...
value
?
Вы всегда можете определить массив указателей, который указывает на одну и ту же переменную:
typedef int* special;
int i = 0;
unsigned int var = 0xdeadbeef;
special arr[5];
for (i=0; i<5; i++)
arr[i] = &var;
*(arr[0]) = 0;
*(arr[3]) += 3;
printf("%d\n", *(arr[2]));
// -> 3
Из всего этого разговора я теперь понимаю проблему следующим образом:
Вы хотите иметь синтаксис массива, например
a[n] // only lookup
a[n]++ // lookup and write
но вы хотите, чтобы семантика изменилась на все эти карты на один и тот же элемент, например
a[0]
a[0]++
C++ способ достижения этого - IMHO, чтобы перегрузить оператор доступа к индексу []. Но вы не хотите этого по соображениям производительности.
Я присоединяюсь к мнению пользователей Lightness Races на орбите, что вы не можете сделать это в C++.
Поскольку вы не предоставляете больше информации о прецеденте, трудно найти решение. Лучше всего я могу представить, что у вас много письменного кода, который использует семантику массива, которую вы не можете изменить.
Остальные (желая сохранить производительность) - это методы трансформации кода (CPP, sed,..), генерирующие исходный код из данного исходного кода с желаемым поведением, например, путем форсирования всех значений индекса до 0.
Без перегрузки operator[]
?
Нет, это невозможно.
К счастью.
В C я так не думаю.
Выражение a[i]
просто означает *(a + i)
, поэтому трудно избежать добавления из-за индексации.
Вы можете быть в состоянии склеить что - то вместе, сделав a
(имя массива) макрос, но я не знаю, как вы не имели бы доступ к индексу, чтобы компенсировать это.