🦥Alex Fails
шаблонные функции-члены класса не могут быть виртуальными, поэтому, думаю, что нет
Dmitry
максимально приближенно и более менее юзабельно хотя бы
Constantine
Я все еще не понимаю, что хотят. Аналог виртуальных шаблонных функций? Вроде, такого эффекта можно добиться, если из шаблонной функции возвращать интерфейс
Constantine
грубо говоря, если мы хотим сделать template <Interface> /*virtual*/ Interface* QueryInterface(); у некоторого класса, мы просто ровно так ее объявляем и не реализуем, а вопрос корректности вызова сваливаем на линковку
Constantine
и дальше "виртуальные" QueryInterface определяются так, чтобы можно было в конструкторе потомка подменить возвращаемый интерфейс
Dmitry
интересно, это кто первым такое нарисовал
𝐀𝐥𝐞𝐱𝐚𝐧𝐝𝐞𝐫
/stat@combot
MrSmith
интересно, это кто первым такое нарисовал
Нужна векторная эмблема на сумку
Ivan
Нет конечно. Это просто пример
Ivan
С другой стороны после вывода, строка не нужна. Почему бы её не замувить?
Constantine
вызывающий может ее просто деструктнуть тогда
Aidar
смысла нет
Aidar
уменьшает область применения функции только
Vladislav
void foo(std::string&& s) { std::string tmp = std::move(s); //не будет ли здесь оверхеда при создании новой строки? std::cout << tmp << " 1\n"; } Чтобы гарантированно без всякого overheada void foo(std::string&& s) { std::cout << s << " 1\n"; s.clear(); }
Вообще, функции не должны принимать rvalue референсы в общем случае (если не конструктор/оператор присваивания). Почти всегда лучше принять по значению, тогда вызывающий может выбрать, сделать ему копию или замувать.
🐙 Antony
Вообще, функции не должны принимать rvalue референсы в общем случае (если не конструктор/оператор присваивания). Почти всегда лучше принять по значению, тогда вызывающий может выбрать, сделать ему копию или замувать.
+1 Исключение из правила - функции, вызов которых должен идти последним и которые принимают большие объекты. Например если делаем хитрый сериализатор, а вся предыдущая логика направлена на формирование данных, то имеет смылс делать void serialize_and_send(std::vector<std::byte>&& data) . Тогда пользователь будет вынужден писать std::move - мы даём хинт, что данные мы у него отбираем. Тоесть написать неэффективно становится сложнее
Aidar
ахах
Surreal
Если в классе хранится просто объект, то имеет ли смысл в конструктор принимать объект по значению и мувать из него просто?
Alexey
статический полиморфизм - это перегруженные функции и шаблоны :)
Крылатый
Любопытно https://www.nayuki.io/page/near-duplicate-features-of-cplusplus
Ivan
Если мы в передаем в функцию что-то например: void foo(string& str) { std::cout << str; }, то на самом деле компилятор это перепишет в это void foo(string* str) { std::cout << *str; } разве нет?
Ivan
далее, если у нас какие-либо действия со строкой, то мы каждый раз тратим время на разыменовыание указателя
Surreal
Да, ссылки через указатели внутри реализованы.
Ivan
поэтому, я хотел бы замувить, чисто для скорости.
Ivan
А после использования строка нам не нужна. Вот пусть она внутри функции и умрёт
Surreal
поэтому, я хотел бы замувить, чисто для скорости.
На самом деле очень спорный вопрос, надо бенчить и смотреть в асм. И это даст прирос только в случае, когда у вас функция вызывается ощутимо много раз и в качестве аргументов передаются каждый раз разные строки.
Igor
У майерса было вроде б ппочему
Не, просто "так есть и все тут, move ничего не перемещает, только кастит"
Ivan
А как замувить const char* ?
Surreal
Никак, это литерал.
Constantine
в смысле? просто берем и мувим
Ivan
можно ли мувить массивы в Си-стиле?
Constantine
const char *s = "Hello, world!" foo(std::move(s));
Surreal
Зачем их мувить? Они итак только указателем представлены.
Constantine
правда, делает совсем не то, о чем вы подумали
Constantine
это компилируется
Constantine
я уверен
Constantine
правда, пользы в этом столько же, сколько в int x = 0; foo(std::move(x));
Constantine
ну если сигнатура foo будет void foo(string), <s>я даже сомневаюсь</s> работает
Constantine
если void foo(const char*), то точно скомпилируется и сработает
Aidar
#supapro
Vladislav
далее, если у нас какие-либо действия со строкой, то мы каждый раз тратим время на разыменовыание указателя
вообще, скорее всего твой метод заинлайнится и никакой ссылки не останется вообще
Vladislav
Крылатый
🐙 Antony
Любопытно https://www.nayuki.io/page/near-duplicate-features-of-cplusplus
В начале список, в котором говорится что С++ скопировал фишки из С, а внизу обяъснение что фишки то разные... Напоминает дипломную работу нерадивого студента: "Слон и черепаха - одно и то же, у обоих есть 4 лапы и хвост <50 страницами ниже> Как мы видим черепаха вообще не похожа на слона, т.к. у слона есть хобот!"
🦥Alex Fails
Kotbegemot го завтра в кафе
Dmitry
с Пензы есть кто?)
🦥Alex Fails
Вроде был
🐙 Antony
Я завтра в Казани
🦥Alex Fails
А. Точно. Блин, я не смогу туда( надо запилить будет потом заметочку по той встрече
Александр
А о чём вообще болтают на встречах?)
Александр
Ну то есть в чатике еще можно обсудить всякие проблемы, поотвечать на вопросы
Александр
Я про встречи в антикафе
Aidar
в чем подвох есть?
🦥Alex Fails
Ну то есть в чатике еще можно обсудить всякие проблемы, поотвечать на вопросы
Мы 27 обсудили фичи языков, докладец автора сфинкса глянули, его оьсудили, етц
Aidar
понятно что явное лучше неявного но лямбды же для сокращения придумали
Constantine
в чем подвох есть?
а как парсить (x(y))?
🦥Alex Fails
там лулзный был. Про ит в целом
Aidar
как x.operator()(y)
Aidar
а как парсить (x(y))?
Constantine
auto f = [](x(y)){} и неявное auto
Aidar
эмм
🦥Alex Fails
Мини-отчет напишу в канал и друга попрошу в контакт запелить
Aidar
так нельзя писать же
Constantine
ну например auto f = [](int(y)){}
Constantine
это разрешенный сейчас синтаксис
Aidar
ничеси
Aidar
зачем
Constantine
auto f = [](int){}
🦥Alex Fails
это разрешенный сейчас синтаксис
+, так в боте сделал в олнгм месте
Aidar
auto f = [](x(y)){} и неявное auto
ну тут вроде явно написано что x это тип
Aidar
этож объявление