Re[6]: Разреженный массив в compile-time
От: vopl Россия  
Дата: 23.07.18 08:53
Оценка:
Здравствуйте, Croessmah, Вы писали:

V>>2. Метод get своим именем как бы намекает, что с его помощью нужно "получать". А на практике, с его помощью можно еще и модифицировать. Такой get должен называться как нибудь типа at


C>Так мы и получаем, либо ссылку на существующий элемент, либо копию значения по-умолчанию.

C>В защиту себя могу сказать, что я не знаю английский язык.
C>В защиту get могу привести в пример std::get, а не std::at.

Посмотри на аналоги

https://en.cppreference.com/w/cpp/container/vector/at
https://en.cppreference.com/w/cpp/container/array/at
https://doc.qt.io/qt-5/qlist.html#at
https://www.boost.org/doc/libs/1_67_0/doc/html/boost/circular_buffer.html#idp42094176-bb
https://www.boost.org/doc/libs/1_67_0/doc/html/boost/container/stable_vector.html#idp58502304-bb

А std::get — это немного другое
Re[4]: Разреженный массив в compile-time
От: avovana Россия  
Дата: 25.07.18 10:46
Оценка:
Здравствуйте, Croessmah, Вы писали:

C>Решение, на киберфоруме, ссылку на которое Вам дали, сделалось примерно за час-полтора. )))


C>Что у Вас не получается? Задача, в принципе, не особо сложная.


Croessmah, рад Вас здесь видеть!
То решение мне сложновато давалось для понимания, т.к. опыта у меня немного.
Оказалось, что проще было написать что-то своё и уточнить)

C>Вам нужно пройти по элементам каждого из массивов и сложить их, соответственно, нужен некий get, возвращающий значение элемента массива по индексу (либо из массива, либо значение по-умолчанию).


C>Переделал своё решение с киберфорума под Ваше.

C>Как видите, такой код проходит все тесты в main.
Спасибо за взгляд на решение проблемы с такой стороны.

Так понимаю, что реализация SequenceType написана в стиле шаблонного программирования:
Представлена шаблонная структура со специализацией. Причем два раза.

Первый раз увидел std::declval<>() в реальном коде. Интересно.

Не совсем понял смысл trailing return type
-> SparseArray<decltype(std::declval<T>() + std::declval<TOther>()), Mask | MaskOther>

Вроде бы auto и так должно вывести тип.

Интересная возможность вернуть ссылку с помощью применения std::conditional_t.

Изучаю код. Спасибо за ответ


Странно, что если раскомментирую секцию private в примере с operatorPlusStage1, operatorPlusStage2, то компилятор начинает ругаться, что в методе operator+ идет обращение к закрытой части класса.
operator+ ведь обычный метод класса, который должен иметь доступ ко всем полям и методам класса.
Отредактировано 25.07.2018 10:52 avovana . Предыдущая версия .
Re[5]: Разреженный массив в compile-time
От: vopl Россия  
Дата: 26.07.18 07:58
Оценка:
Здравствуйте, avovana, Вы писали:

A>Странно, что если раскомментирую секцию private в примере с operatorPlusStage1, operatorPlusStage2, то компилятор начинает ругаться, что в методе operator+ идет обращение к закрытой части класса.

A>operator+ ведь обычный метод класса, который должен иметь доступ ко всем полям и методам класса.

Хм.. Вроде это мои названия отсюда http://rsdn.org/forum/cpp.applied/7191800.1
Автор: vopl
Дата: 09.07.18


(этот форум — он деревянный, ответ лучше давать на исходное сообщение а не на любое, иначе становится сложно отслеживать ход дискуссии так как начинается каша)

У меня там вроде не было никаких private Покажи проблемный код целиком?
Re[6]: Разреженный массив в compile-time
От: vopl Россия  
Дата: 26.07.18 09:14
Оценка:
Здравствуйте, Croessmah, Вы писали:

C>Здравствуйте, vopl, Вы писали:


V>>А я бы вот докопался все таки


C>Докопаться всегда можно и приятно. )))


V>>1. Метод sum...

C>Да, можно и так:...

V>>2. Метод get...

C>Так мы и получаем...

V>>3. operator+...

C>Убрать из конструктора...

4. SFINAE для operator+ так и не сделано
оно есть. Недосмотрел
Отредактировано 26.07.2018 9:19 vopl . Предыдущая версия .
Re[6]: Разреженный массив в compile-time
От: avovana Россия  
Дата: 26.07.18 18:36
Оценка:
Здравствуйте, vopl, Вы писали:

V>Здравствуйте, avovana, Вы писали:


A>>Странно, что если раскомментирую секцию private в примере с operatorPlusStage1, operatorPlusStage2, то компилятор начинает ругаться, что в методе operator+ идет обращение к закрытой части класса.

A>>operator+ ведь обычный метод класса, который должен иметь доступ ко всем полям и методам класса.

V>Хм.. Вроде это мои названия отсюда http://rsdn.org/forum/cpp.applied/7191800.1
Автор: vopl
Дата: 09.07.18


V>(этот форум — он деревянный, ответ лучше давать на исходное сообщение а не на любое, иначе становится сложно отслеживать ход дискуссии так как начинается каша)


V>У меня там вроде не было никаких private Покажи проблемный код целиком?


Да, всё верно. Это тот самый пример. Сейчас использую твой подход в реализации operator+
Думал улучшить защищенность класса, но добавление секции private рубит идею на корню:
https://github.com/avovana/CodeBase/blob/fc8c27a423c13f909a375a439e8b2123f4b78e6b/SparseArray.cpp#L55

(П.с. На этот раз, думаю, получилось ответить на нужное сообщение)
Re[7]: Разреженный массив в compile-time
От: vopl Россия  
Дата: 27.07.18 08:41
Оценка:
Здравствуйте, avovana, Вы писали:

A>>>Странно, что если раскомментирую секцию private в примере с operatorPlusStage1, operatorPlusStage2, то компилятор начинает ругаться, что в методе operator+ идет обращение к закрытой части класса.

A>>>operator+ ведь обычный метод класса, который должен иметь доступ ко всем полям и методам класса.

V>>У меня там вроде не было никаких private Покажи проблемный код целиком?


A>Думал улучшить защищенность класса, но добавление секции private рубит идею на корню:

A>https://github.com/avovana/CodeBase/blob/fc8c27a423c13f909a375a439e8b2123f4b78e6b/SparseArray.cpp#L55

да, действительно, ругань есть. Обрати внимание, что ругань идет на обращение к закрытой части другого класса. Дистилированный пример:


// из этого шаблона можно порождать разные типы
template <typename T>
class C
{
private:
    int v;

public:

    template <typename T2>
    void f(C<T2> another)
    {
        v = another.v;//обращение к приватному члену C<T2>::v
    }
};

int main ()
{
    C<int> c1;  //объект c1 имеет тип C<int>
    C<char> c2; //объект c2 имеет тип C<char> - обрати внимание, это уже другой тип, хотя и полученный из одного и того же шаблона

    c1.f(c1);   //нормально, так как внутри C<int>::f будет обращение к C<int>::v.
    c2.f(c2);   //нормально


    //c1.f(c2); //а тут уже не будет компилироваться так как C<int>::f будет пытаться получить доступ к C<char>::v
    //c2.f(c1); //аналогично

    //struct Some;
    //c2.f(C<Some>{}); //аналогично

    return 0 ;
}


То есть, другими словами:
SparseArray это не класс, это шаблон. Из него получаются разные конкретные типы. Один из них в своих методах пытается получить доступ к приватным членам другого типа. Компилятор об этом резонно сообщает.

Что делать? Вариантов на самом деле масса, думаю сам вполне придумаешь как это красиво обрулить. Все таки задача — спортивная)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.