Сообщество программистов Autodesk в СНГ

Разное => Разное => Тема начата: Алексей (IdeaSoft) от 28-02-2017, 18:02:07

Название: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: Алексей (IdeaSoft) от 28-02-2017, 18:02:07
Подскажите кто-то сталкивался с такого рода перегрузкой.
к примеру есть двухмерный массив.

Код - C# [Выбрать]
  1. int[,] a = new int[5,5];

Что бы получить значение элемента (2;3) нужно писать так
Код - C# [Выбрать]
  1. int b = a[2,3];

А можно как-то перегрузить оператор
что бы обращаться к массиву через точку?

Т.е вот так

Код - C# [Выбрать]
  1. struct point {
  2.     public int x, y;
  3.     public point(int _x, int _y) {
  4.        x=_x;
  5.        y=_y;
  6.     }
  7. }
  8. int[,] a = new int[5,5];
  9. point pos = new point(2,3);
  10. int b = a[pos];
  11.  
Если C# такого не сможет, то может в С++ получится?



 

Название: Re: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: Александр Ривилис от 28-02-2017, 18:28:16
А можно как-то перегрузить оператор
что бы обращаться к массиву через точку?
Насколько я знаю нельзя. А зачем такие сложности?
Так не годится:
Код - C# [Выбрать]
  1. int b = a[pos.x,pos.y];
?
Название: Re: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: Алексей (IdeaSoft) от 28-02-2017, 19:32:42
Не так-то вполне сгодится.
Просто передать точку, также компактнее код выглядит.
можно конечно функцию придумать с одним аргументом point.
Скорее применять такое не буду.
Для интереса хотел узнать есть ли
такая возможность в языке программирования.

ведь эту самую перегрузку придумали для удобства.
Но у перегрузки есть один недостаток.
Когда изучаешь "чужой".
Кто знает какие перегрузки делал автор кода.
 
Название: Re: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: Дима_ от 28-02-2017, 23:34:46
За такого рода функционалом - обращайтесь в макросы лиспа - там можно почерпнуть много интересных трюков как представить код.
Название: Re: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: German от 01-03-2017, 16:38:52
Можно создать новый тип на основе двумерного массива. И добавить индексатор-"через точку".
Поддержу:
Цитировать
А зачем такие сложности?
Название: Re: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: trir от 02-03-2017, 08:39:36
Код - C# [Выбрать]
  1.     public static class ArrayExtensions
  2.     {
  3.         public static int GetValue(this Array target, point p)
  4.         {
  5.             return (int)target.GetValue(p.x, p.y);
  6.         }
  7.     }

Код - C# [Выбрать]
  1.             int[,] a = new int[5, 5];
  2.             point pos = new point(2,3);
  3.             int b = a.GetValue(pos);
Название: Re: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: Алексей (IdeaSoft) от 02-03-2017, 09:49:09
А если появится другой тип данных.
Нужно будет для каждого типа добавлять функцию?

Код - C# [Выбрать]
  1. public class MyTypeData {...}
  2.    
  3. public static class ArrayExtensions
  4.     {
  5.         public static int GetValue(this Array target, point p)
  6.         {
  7.             return (int)target.GetValue(p.x, p.y);
  8.         }
  9.  
  10.         public static MyTypeData GetValue(this Array target, point p) {
  11.              return (MyTypeData)target.GetValue(p.x, p.y);
  12.         }
  13.     }
Название: Re: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: trir от 02-03-2017, 09:51:15
Код - C# [Выбрать]
  1. public static T GetValue<T>(this Array target, point p);
  2.  
  3. int b = a.GetValue<int>(pos);

но лучше просто сделать свой класс

/* В очередной раз напоминаю как следует форматировать код на форуме. Александр Ривилис */
Название: Re: Возможно ли сделать перегрузку оператора для двумерных массивов
Отправлено: Алексей (IdeaSoft) от 02-03-2017, 10:45:49
А что если так.
Сделать функцию возвр. object
и преобразование типа делать.
Правда преобразование типа небезопасное.

Код - C# [Выбрать]
  1. public static class ArrayExtensions {
  2.    public static object GetValue(this Array target, point p) {
  3.        return target.GetValue(p.x, p.y);
  4.    }
  5. }
  6. ...    
  7. public class MyClass {...}
  8. ...
  9. MyClass[,] arr = new MyClass[5, 5];
  10. pnt p = new point(1,3);
  11. MyClass m = (MyClass)arr.GetValue(p);