Aidar
Ну это бага в си++
Constantine
Я пока пытаюсь придумать workaround на это
Constantine
Для member operator я его просто проверил уже
Constantine
template <typename TType> constexpr std::enable_if_t<!sfinae::has_member_equal_to<TType>::value, bool> has_possible_bad_member_equal_to() { return false; } template <typename TType> constexpr std::enable_if_t<sfinae::has_member_equal_to<TType>::value, bool> has_possible_bad_member_equal_to() { using type_traits = traits::member_equal_to<TType>; static_assert(type_traits::arity::value == 2, "bad function traits"); return !std::is_same<type_traits::arg<0>::type, TType const*>::value || sizeof(std::remove_reference_t<type_traits::arg<1>::type>) != sizeof(TType) ; }
Constantine
Я пока размышляю на тему того, чтобы взять & у соответствующей функции и допроверять внешние
Aidar
Ваще имхо надо неполиморфные ссылки в язык и все
Aidar
Как ещё один вид
Aidar
Я это говно не очень продумал покс
Constantine
Ну это можно реализовать как exact_reference
Aidar
Надо в язык
Constantine
Хотя у меня не получилась нормальная реализация
Dmitry
Подскажите, каким образом std string предоставляет одновлеменно c_str и data?
Anonymous
data() — указатель на первый элемент, c_str — ээ... массив?
Dmitry
А в чем проблема?
ни в чем. просто в одном null-character есть а в другом нет
Dmitry
Он кажись везде есть
тогда в чем отличие
Aidar
Конст
Constantine
и в имени функции
Aidar
И дата появилась позже
Anonymous
ни в чем. просто в одном null-character есть а в другом нет
[cling]$ a.c_str()[a.length()] (const char) '0x00' [cling]$ a.data()[a.length()] (const char) '0x00' а это что такое?
Berkus
Подскажите, каким образом std string предоставляет одновлеменно c_str и data?
это одно и то же, указатель на одну область памяти
Anonymous
кстати
Constantine
Returns a pointer to the underlying array serving as character storage. The pointer is such that the range [data(); data() + size()) is valid and the values in it correspond to the values stored in the string. The returned array is not required to be null-terminated. If empty() returns true, the pointer is a non-null pointer that should not be dereferenced. (until C++11)
Anonymous
http://en.cppreference.com/w/cpp/string/basic_string/c_str
Александр
Constantine
The returned array is null-terminated, that is, data() and c_str() perform the same function. If empty() returns true, the pointer points to a single null character. (since C++11)
Constantine
блин, не хочу курить правила выбора operator ==
Constantine
Да, но я в ней не один :)
Антон, а тебе известны нормальные планы борьбы с вот этим? struct A { bool operator == (A const& other) { return true; } }; struct B : A {}; void f() { B b1, b2; b1 == b2; }
Vitaliy
Да, но я в ней не один :)
Да, я знаю. Просто смотрю, что имя и фамилия знакомые)) Кажется ты делал доклад, когда ещё Гор по удаленке был.
🐙 Antony
тогда в чем отличие
до с++11 data() мог возвращать не нуль терминированную строку, а c_str() мог аллоуировать память и добивать нолик в конец. Но я/ не знаю имплементаций, которые до с++11 не хранили '\0' в конце. С с++11 и позднее , для std::string data() и c_str() - одно и то же
Constantine
А чего именно хочется достичь?
Хочется, чтобы нельзя было ошибиться и вызвать == за счет implicit cast аргументов
🐙 Antony
Хочется, чтобы нельзя было ошибиться и вызвать == за счет implicit cast аргументов
Вожно например вот так: struct B : A { bool operator==(const B&) const = delete; } ;
Constantine
Вожно например вот так: struct B : A { bool operator==(const B&) const = delete; } ;
Если автор класса В задумался над тем, что у класса А есть operator ==, то этой проблемы действительно не будет. Менее месяца назад я выяснил, что я могу случайно не задуматься над этой проблемой при наследовании :)
🐙 Antony
Вожно например вот так: struct B : A { bool operator==(const B&) const = delete; } ;
Лучше даже: struct B : A { } ; bool operator==(const B&, const B&) = delete; bool operator==(const B&, const A&) = delete; bool operator==(const A&, const B&) = delete;
Constantine
Вожно например вот так: struct B : A { bool operator==(const B&) const = delete; } ;
Собственно сейчас у меня запрашиваются traits на member == и если он есть проверяется, что сигнатура в точности совпадает. Но мне... достаточно проблематично залезть по-нормальному внутрь контейнеров, например
Constantine
У меня не получилось написать реализацию обертки, которая вызовет конкретную сигнатуру operator == и только её
Aidar
У итераторов тоже
Aidar
Точнее в трейтсах
🐙 Antony
Если автор класса В задумался над тем, что у класса А есть operator ==, то этой проблемы действительно не будет. Менее месяца назад я выяснил, что я могу случайно не задуматься над этой проблемой при наследовании :)
тогда правильнее наверное: * не наследоваться публично * или не наследоваться от базового класса, ф сделать базовый класс членом класса наследника
Constantine
Хм... вот это скорее похоже на дефект, чем на разумное поведение #include <vector> int main() { bool(*var)(std::vector<int> const&, std::vector<int> const&) = (&operator==); return 0; }
Constantine
оказывается в этом контексте не выполняется ADL
Constantine
кому писать репорт? :) санитарам? :)
Constantine
В спортлотто
Ну вот скажи мне, Слава. Это по-твоему дефект или так задумано?
Constantine
Ну или хотя бы что используется для десериализаторов в facebook
🐙 Antony
оказывается в этом контексте не выполняется ADL
Ну так у вас и аргументов то нет: функцию вы же и не вызываете :)
🐙 Antony
А вообще занятно, завтра посмотрю поподробнее
Ioann_
Нельзя применить разве ? Вроде к оператору () можно было
Ioann_
На счет других не знаю, проясните :?
Ioann_
Или тут речь о классе предке :?
Vladislav
Нельзя применить разве ? Вроде к оператору () можно было
нельзя, он только для конструкторов и conversion операторов
Ioann_
Угу. Учту. Ну и вопргс номер 2: у меня есть конструктор, и много полей в классе. Вопрос такой, стоит ли пилить констуктор который может инитить сразу все поля, то есть на вход принимает все N нужных параметров :?
Ioann_
Слишком громоздкр выглядит при использовании
Ioann_
Сеттеры гетеры так то есть
Ioann_
Ну невалидности там точно не будет, т.к речь о qt полях
Ioann_
Просто он огромен
Ioann_
Ну, что бы все ок было - да, то есть если они по умолчанию заинитятся, то потом просто можно сеттером поставить. Речь идет о картиночках если что.
Ivan
кто-нибудь пользовался https://github.com/eddic/fastcgipp ?
Nikita
Возможно ли быть веб программистом и не веб программистом (на с/с++ и т.п. ) одновременно?)
Vergil
Возможно ли быть веб программистом и не веб программистом (на с/с++ и т.п. ) одновременно?)
ну если в вэбе ты разрабатываешь бэкэнд.. на плюсах 😆 А если серьезно, то не вижу проблемы. Вопрос только в твоей обучаемости и времени, которое ты посвящаешь своему СамоиНеСамоОбразованию
Anonymous
Все привет!
Anonymous
*всем*
Matwey
Господа. А как в студии называется билдин, который возвращает число нулевых битов начиная с наименее значимого?
Berkus
clz?
Berkus
а, с наименее
Berkus
ctz