C++, осуществление способа обращения к двумернмоу массиву [line,column]
a=1;
MyClass[a,2];
Таким образом... Может кто знает точный способ?
a=1;
MyClass[a,2];
Таким образом... Может кто знает точный способ?
а вам, простите, зачем это надо? по нормальному обращаться не интересно?
попробуйте перегрузить оператор запятой и колдовать... может помогут макросы... а вообще кажись это не реально!
да я то откуда знаю, может это подлые происки паскалистов в надежде обратить в свою веру ни о чем не подозривающих сипласпласников!:D
хистрость в том, что оператор [] бинарный, правый операнд есть адрес первого элемента массива, а левый смещение, перегружать оператор повышая его размерность невозможно!
я думаю в некоторых компиляторах возможно следующие: пишешь свой класс индекса, перегружаешь для него запятую и реализуешь конструтор с параметром типа целого при это не указывая ключевого слова эксплисит, что в теории дает право компилятору использовать оный конструктор для не явного приведения типов. затем пишешь свой класс, обращение к массиву объектов которого должно так осуществляться, перегружаешь в нем оператор [], где в качестве параметра должен быть твой индекс. идея всех этих манипуляций в следующем: при вызове компилятор не явно приводит к классу индекса целое, по средствам конструктора с параметрами, затем в дело вступает оператор запятой, а затем индексатор. может быть перегрузить запятую придется для правого оператора как индекса, для левого как целого. возможно нужно просто реализовать в классе индекса конструктор с двумя параметрами типа целого, в надежде, что умный компилятор приведет тип к классу индексатора.
работоспособность всего выше перечисленного не гарантирую, бо тут в деле черная магия и стандарт отдыхает, а значит это может на одном компиляторе работать на другом нет, или вообще не работать.
отмечу, что задача конечно интересная, из серии "как прострелить себе ногу"! собственно черная магия в надежде обмануть стандарт и компилятор. если выше перечисленное не поможет, то когда преподаватель все таки покажет тебе решение, будь добр запостить его сюда, уж больно интересно. бо варианта два или твой препод знатный некромант, или просто не знает чего задает!:)
Artem_3A, то что вы написали в чтении выгладет запутанным ) не доконца разобрался, ну думаю то, о чём вы говорите (не бейте, если что-то не уловил в вашем тексте) уже порверялось. Вот код с винграда который мне дали
{
index_t(int i) : value(i) {}
int value;
};
struct index2_t
{
index2_t(int i_, int j_) : i(i_), j(j_) {}
int i, j;
};
template<typename T, int N, int M>
struct matrix_t
{
T data[N*M];
T& operator[](index2_t index)
{
return data[index.i + index.j * N];
}
};
// index2_t operator,(int i, int j) - не заработает
// т.к. нельзя перегрузить для аргументов встроенных типов
index2_t operator,(index_t i, index_t j)
{
return index2_t(i.value, j.value);
}
index2_t operator,(int i, index_t j)
{
return index2_t(i, j.value);
}
index2_t operator,(index_t i, int j)
{
return index2_t(i.value, j);
}
int main()
{
matrix_t<int, 10, 5> m;
for(int i = 0; i != 10*5; ++i)
m.data = i;
cout << m[index_t(1), 2] << '\n';
cout << m[3, index_t(4)] << '\n';
}
и дальше ещё довели до идексации элемента структуры на _1
ну т.е. запись пиршла к виду A[_1,2] как пример.
Вот код, со старого топика коуднэта
class array2d
{
public:
template<class T1,class T2>
T operator[](const std::pair<T1,T2>& p)
{
std::cout<<"first="<<p.first<<" second="<<p.second<<std::endl;
return (T)0;
};
};
template <typename T>
struct index
{
template <typename T2>
std::pair<T,T2> operator,(const T2& j)
{
return std::make_pair(val,j);
};
operator T() const
{
return val;
};
index(T _val) : val(_val) {};
private:
T val;
};
int _tmain(int argc, _TCHAR* argv[])
{
array2d<float> array;
index<int> a=654;
index<bool> b=true;
index<int> c=a;
array[a,b];
array[a,890];
array[a,c];
std::cin.get();
return 0;
}
но запись A[1,2] всё равно не возможна (если честно, этот способ я сам не поня лкак устроен, отчнее проблемы с шаблоном на оператор запятая, не сталкивался и пока ещё н еразобрался)
Может кого-то это наттолкнёт на нужные идеи
какой компилятор используешь?
собственно ни каких идей больше и нет, ну если учесть, что на винграде и я указали тебе один и тот же путь... или носители этих идей упорно молчат!
вот код
{
public:
int i;
int j;
public:
index(int _i, int _j)
{
i = _i;
j = _j;
}
};
class array
{
public:
int operator[](index& i)
{
return a[i.i][i.j];
}
private:
int a[5][5];
}
void main(void)
{
array a;
int t = a[2,3];
}
в мелкосовтовской студии он не работает, можно испытать его на гцц и других компиляторах.
еще можешь обратиться к ребятам занимающимся разработкой гцц, ну если англицкий знаешь конечно!=))) ну или на форум мелкосовта, опять же если пишешь по буржуйски. как бы уж разработчики компиляторов должны знать как такое можно сделать.
ну и последняя инстанция иди к своему преподавателю с повинной, показывай чего уже наделал! думаю он тебе решение расскажет, тупо за старание, если конечно сам знает!=)))
ЗЫ: и не забудь запостить решение сюда как его найдешь!:D
Хорошо, к концу недели расскажу, чему я научился и не отстану пока не узнаю вернее решение для наших малыхсофтов. Спасибо, что отликнулись;)