Size: a a a

2021 March 10

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
я так понимаю, std::initializer_list<Big&> не будет работать.
struct Big {};

template <typename T, std::size_t N>
void foo(const T (&args)[N]) {
   (void)args;
}

int main() {
   foo({ Big{}, Big{} });
}

я так понимаю, вот это будет работать
источник

KO

Konstantin Osipov in pro.cxx
у меня big non-copyable... если я правильно читаю код выше, то foo принимает ссылку на массив T
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
у меня big non-copyable... если я правильно читаю код выше, то foo принимает ссылку на массив T
struct Big {
   Big() = default;
   Big(Big const&) = delete;
   Big(Big &&) = delete;
};

template <typename T, std::size_t N>
void foo(T (&&args)[N]) {
   (void)args;
}

int main() {
   foo({ Big{}, Big{} });
}
edit: а, нет, всё норм
источник

KO

Konstantin Osipov in pro.cxx
вы же temporaries передаёте
источник

CD

Constantine Drozdov in pro.cxx
а что я должен передавать?
источник

KO

Konstantin Osipov in pro.cxx
попробуйте объявления экземпляров вынести в отдельные объявления
источник

KO

Konstantin Osipov in pro.cxx
Big big1, big2;
foo({big1, big2});
источник

CD

Constantine Drozdov in pro.cxx
левые ссылки?
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
Big big1, big2;
foo({big1, big2});
ну явные std::ref(big1) еще никому не мешали :)
источник

KO

Konstantin Osipov in pro.cxx
:) тогда уж проще &big1, &big2, и не париться.
источник

AN

Alexander N in pro.cxx
Constantine Drozdov
struct Big {
   Big() = default;
   Big(Big const&) = delete;
   Big(Big &&) = delete;
};

template <typename T, std::size_t N>
void foo(T (&&args)[N]) {
   (void)args;
}

int main() {
   foo({ Big{}, Big{} });
}
edit: а, нет, всё норм
А разве копирование не избегается? Обьект наверное один раз должен создаваться
источник

IZ

Ilia Zviagin in pro.cxx
Konstantin Osipov
я так понимаю, std::initializer_list<Big&> не будет работать.
Почему так обязательно его использовать?
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
Big big1, big2;
foo({big1, big2});
а тут окажется, что массив ссылок не бывает
это не будет работать через array/initializer_list/whatever
источник

KO

Konstantin Osipov in pro.cxx
вот код - он требует наличия copy constructor в Big
источник

KO

Konstantin Osipov in pro.cxx
источник

KO

Konstantin Osipov in pro.cxx
да, мы приходим к тому что нужен variadic template + parameter pack. Тогда я передам T&&... и проитерирую по ним уже внутри функции. будет hairy внутри но зато красиво снаружи
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
да, мы приходим к тому что нужен variadic template + parameter pack. Тогда я передам T&&... и проитерирую по ним уже внутри функции. будет hairy внутри но зато красиво снаружи
ну это вариант передачи
foo(big1, big2);
тут без variadic никак хотя бы потому, что у функции переменное число аргументов
источник

KO

Konstantin Osipov in pro.cxx
а итерация по parameter pack только рекурсией или через fold expressions? было бы круто если бы какой-нибуь constexpr for добавили для этого
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
а итерация по parameter pack только рекурсией или через fold expressions? было бы круто если бы какой-нибуь constexpr for добавили для этого
а что вы с параметрами хотите сделать?
источник

CD

Constantine Drozdov in pro.cxx

void bar(Big & big) {
   (void)big;
}

template <typename... Args>
void foo(Args&&... args) {
   ((void)bar(args), ...);
}

как бы всегда есть такой вариант
источник