Теперь задача в том, чтобы сделать член data закрытым и предоставить конструкторы для этого класса так, чтобы форма инициализации не изменилась. Ну или изменилась, но как-нибудь разумно. Например, меня бы устроило, если бы инициализация вложенных структур данных выглядела бы так:
Здравствуйте, rg45, Вы писали:
R>Привет всем. Есть желание поговорить об aggregate и list инициализацииях и о том, как их подружить.
В общем-то теперь, когда в constexpr-функциях можно практически себя не ограничивать, то можно тупо в лоб расписать любую логику инициализации.
Например:
template <typename T, size_t N>
struct Array
{
private:
T data[N];
public:
constexpr Array(std::initializer_list<T> init)
: data{}
{
if (init.size() > N) {
throw"overflow";
}
using std::begin;
using std::end;
auto dst = begin(data);
for (auto src = begin(init); src != end(init); ++src, ++dst) {
*dst = *src;
}
}
auto begin() const { return std::begin(data); }
auto end() const { return std::end(data); }
};
Вполне работает.
И если пометить результат как constexpr, то все эти циклы и проверки гарантированно будут выполняются на этапе компиляции: https://ideone.com/J3t69X
Здравствуйте, watchmaker, Вы писали:
W>Вполне работает. W>И если пометить результат как constexpr, то все эти циклы и проверки гарантированно будут выполняются на этапе компиляции: https://ideone.com/J3t69X
Я забыл акцент проставить, вообще-то, мечта была все это проделать в списке инициализации. И у меня даже есть рабочий вариант, но он ужасен!
Список инициализации ведь совсем не обязательно состоит из констант, там вполне могут быть и рантаймовые данные. Да и сами объекты Array, если смотреть с прицелом в прикладную область, не будут constexpr, в большинстве своем.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, watchmaker, Вы писали:
W>В общем-то теперь, когда в constexpr-функциях можно практически себя не ограничивать, то можно тупо в лоб расписать любую логику инициализации. W>Например: W>
Ну доводы понятны, в принципе. В то же время, никто не говорит: "не передавайте по ссылке, а то случится что-нибудь страшное" Меня вот этот момент интересовал больше всего.
--
Не можешь достичь желаемого — пожелай достигнутого.
как это не случится ? случится, код медленнее будет)) лишних операторов копирования добавится
и потом герои будут по форумам кричать что С++ тормозит итд
R>как это не случится ? случится, код медленнее будет)) лишних операторов копирования добавится R>и потом герои будут по форумам кричать что С++ тормозит итд
Здравствуйте, watchmaker, Вы писали:
W>В общем-то теперь, когда в constexpr-функциях можно практически себя не ограничивать, то можно тупо в лоб расписать любую логику инициализации. W>И если пометить результат как constexpr, то все эти циклы и проверки гарантированно будут выполняются на этапе компиляции: https://ideone.com/J3t69X
Я пока рассматриваю только сценарий, когда все эти объекты НЕ constexpr. Дошел вот до такого извращения: