Здравствуйте, 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 — это немного другое
Здравствуйте, 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+ ведь обычный метод класса, который должен иметь доступ ко всем полям и методам класса.
Здравствуйте, avovana, Вы писали:
A>Странно, что если раскомментирую секцию private в примере с operatorPlusStage1, operatorPlusStage2, то компилятор начинает ругаться, что в методе operator+ идет обращение к закрытой части класса.
A>operator+ ведь обычный метод класса, который должен иметь доступ ко всем полям и методам класса.
Хм.. Вроде это мои названия отсюда
http://rsdn.org/forum/cpp.applied/7191800.1Автор: vopl
Дата: 09.07.18
(этот форум — он деревянный, ответ лучше давать на исходное сообщение а не на любое, иначе становится сложно отслеживать ход дискуссии так как начинается каша)
У меня там вроде не было никаких private
Покажи проблемный код целиком?
Здравствуйте, Croessmah, Вы писали:
C>Здравствуйте, vopl, Вы писали:
V>>А я бы вот докопался все таки
C>Докопаться всегда можно и приятно. )))
V>>1. Метод sum...
C>Да, можно и так:...
V>>2. Метод get...
C>Так мы и получаем...
V>>3. operator+...
C>Убрать из конструктора...
4. SFINAE для operator+ так и не сделано
оно есть. Недосмотрел
Здравствуйте, 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
(П.с. На этот раз, думаю, получилось ответить на нужное сообщение)
Здравствуйте, 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 это не класс, это шаблон. Из него получаются разные конкретные типы. Один из них в своих методах пытается получить доступ к приватным членам другого типа. Компилятор об этом резонно сообщает.
Что делать? Вариантов на самом деле масса, думаю сам вполне придумаешь как это красиво обрулить. Все таки задача — спортивная)