Возможно ли сделать перегрузку оператора для двумерных массивов

Автор Тема: Возможно ли сделать перегрузку оператора для двумерных массивов  (Прочитано 4391 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Подскажите кто-то сталкивался с такого рода перегрузкой.
к примеру есть двухмерный массив.

Код - 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# такого не сможет, то может в С++ получится?



 


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А можно как-то перегрузить оператор
что бы обращаться к массиву через точку?
Насколько я знаю нельзя. А зачем такие сложности?
Так не годится:
Код - C# [Выбрать]
  1. int b = a[pos.x,pos.y];
?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Не так-то вполне сгодится.
Просто передать точку, также компактнее код выглядит.
можно конечно функцию придумать с одним аргументом point.
Скорее применять такое не буду.
Для интереса хотел узнать есть ли
такая возможность в языке программирования.

ведь эту самую перегрузку придумали для удобства.
Но у перегрузки есть один недостаток.
Когда изучаешь "чужой".
Кто знает какие перегрузки делал автор кода.
 

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
За такого рода функционалом - обращайтесь в макросы лиспа - там можно почерпнуть много интересных трюков как представить код.

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Можно создать новый тип на основе двумерного массива. И добавить индексатор-"через точку".
Поддержу:
Цитировать
А зачем такие сложности?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Код - 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);
« Последнее редактирование: 02-03-2017, 09:50:24 от Александр Ривилис »

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
А если появится другой тип данных.
Нужно будет для каждого типа добавлять функцию?

Код - 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.     }

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Код - C# [Выбрать]
  1. public static T GetValue<T>(this Array target, point p);
  2.  
  3. int b = a.GetValue<int>(pos);

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

/* В очередной раз напоминаю как следует форматировать код на форуме. Александр Ривилис */
« Последнее редактирование: 02-03-2017, 11:26:42 от Александр Ривилис »

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
А что если так.
Сделать функцию возвр. 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);