@ProCxx

Страница 1233 из 2477
Aidar
23.08.2017
14:09:34
Никак

Constantine
23.08.2017
14:10:07
вот эту штуку переиспользовать не получается namespace impl_ { template <typename, typename... TArguments> struct is_invokable_helper : std::false_type { }; template <typename... TArguments> struct is_invokable_helper<std::void_t<decltype(std::invoke(std::declval<TArguments>()...))>, TArguments...> : std::true_type { }; } template <typename... TArguments> using is_invokable = impl_::is_invokable_helper<TArguments...>;

Aidar
23.08.2017
14:10:17
Можно только отдельно для каждого whatever

Google
Constantine
23.08.2017
14:10:47
мало ли, может я просто тупой)

namespace sfinae { namespace impl_ { template <template<typename...> typename TTemplate, typename, typename... TArguments> struct can_be_instanced_helper : std::false_type { }; template <template<typename...> typename TTemplate, typename... TArguments> struct can_be_instanced_helper<TTemplate, std::void_t<TTemplate<TArguments...>>, TArguments...> : std::true_type { }; } template <template<typename...> typename TTemplate, typename... TArguments> using can_be_instanced = impl_::can_be_instanced_helper<TTemplate, void, TArguments...>; }

вот это получается, опять же здесь не получается применить

Александр
23.08.2017
14:11:41
Где-то я уже это видел..

is_detected

Constantine
23.08.2017
14:15:04
См detection idiom http://en.cppreference.com/w/cpp/experimental/is_detected
Такое ощущение, будто я это и написал между делом)

См detection idiom http://en.cppreference.com/w/cpp/experimental/is_detected
Собственно, у меня не получается единственным случай, когда у меня перегруженная шаблонная фукнция в духе template <typename TType> inline bool is_null(std::unique_ptr<TType> const& value); template <typename TType> inline bool is_null(std::shared_ptr<TType> const& value); template <typename TType> inline bool is_null(TType const* value);

мне приходится трейты руками писать

ааааа! namespace sfinae { template <typename T> using is_null_type = decltype((utils::is_null)(std::declval<T const&>())); template <typename T> using has_is_null = can_be_instanced<is_null_type, T>; }

Nik
23.08.2017
14:26:46
Надеюсь мне такое никогда не придется писать...

Constantine
23.08.2017
14:27:24
Не знаю, мне нравится

Возможно дело в том, что я учил С++ по книжке Александреску :)

Google
Aidar
23.08.2017
14:35:15
Но Александреску же упоротый гений

Ivan
23.08.2017
14:35:23
Ребята, если ищем разработчика, куда можно эту информацию забросить? Исходя из правил группы не очень понял. Кто подскажет?

fox.cpp
23.08.2017
14:35:37
@AlexFails

Aidar
23.08.2017
14:35:41
@AlexFails

В лс

Bape
23.08.2017
14:37:50
Heyy

Constantine
23.08.2017
14:38:59
Еще один вопрос. Уже есть proposal на то, чтобы std::vector и остальные контейнеры выставляли enable_if на операторы ==, <, ...?

Aidar
23.08.2017
14:39:21
Уже было в этом чате

Vitaliy
23.08.2017
14:39:32
См detection idiom http://en.cppreference.com/w/cpp/experimental/is_detected
Антон, ты представляешь российскую группу по стандартизации C++ ?

Constantine
23.08.2017
14:40:23
И в продолжение: есть ли какие-нибудь принципиальные концепции, позволяющие избежать срезки в operator == ?

Aidar
23.08.2017
14:41:05
Я уже говорил

Constantine
23.08.2017
14:41:09
Какие?

Aidar
23.08.2017
14:41:19
Если они принципиально разные я против этого говна вот что я говорил

Constantine
23.08.2017
14:41:38
struct A { bool operator == (A const& other) { return true; } } struct B : A {} void f() { B b1, b2; b1 == b2; }

Aidar
23.08.2017
14:42:25
Ну это бага в си++

Constantine
23.08.2017
14:42:42
Я пока пытаюсь придумать workaround на это

Для member operator я его просто проверил уже

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) ; }

Я пока размышляю на тему того, чтобы взять & у соответствующей функции и допроверять внешние

Aidar
23.08.2017
14:44:59
Ваще имхо надо неполиморфные ссылки в язык и все

Google
Aidar
23.08.2017
14:45:16
Как ещё один вид

Я это говно не очень продумал покс

Constantine
23.08.2017
14:45:36
Ну это можно реализовать как exact_reference

Aidar
23.08.2017
14:46:03
Надо в язык

Constantine
23.08.2017
14:46:08
Хотя у меня не получилась нормальная реализация

reagentoo
23.08.2017
14:46:43
Подскажите, каким образом std string предоставляет одновлеменно c_str и data?

fox.cpp
23.08.2017
14:47:21
data() — указатель на первый элемент, c_str — ээ... массив?

reagentoo
23.08.2017
14:48:06
А в чем проблема?
ни в чем. просто в одном null-character есть а в другом нет

Aidar
23.08.2017
14:48:34
reagentoo
23.08.2017
14:48:54
Он кажись везде есть
тогда в чем отличие

Aidar
23.08.2017
14:49:00
Конст

Constantine
23.08.2017
14:49:08
и в имени функции

Aidar
23.08.2017
14:49:09
И дата появилась позже

fox.cpp
23.08.2017
14:49:25
ни в чем. просто в одном null-character есть а в другом нет
[cling]$ a.c_str()[a.length()] (const char) '0x00' [cling]$ a.data()[a.length()] (const char) '0x00' а это что такое?

Berkus
23.08.2017
14:50:50
Подскажите, каким образом std string предоставляет одновлеменно c_str и data?
это одно и то же, указатель на одну область памяти

Google
fox.cpp
23.08.2017
14:51:06


Constantine
23.08.2017
14:51:07
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)

fox.cpp
23.08.2017
14:51:10
http://en.cppreference.com/w/cpp/string/basic_string/c_str

Александр
23.08.2017
14:51:13
Constantine
23.08.2017
14:51:22
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)

Admin
ERROR: S client not available

Constantine
23.08.2017
14:53:48
блин, не хочу курить правила выбора operator ==

Constantine
23.08.2017
14:55:44
Да, но я в ней не один :)
Антон, а тебе известны нормальные планы борьбы с вот этим? struct A { bool operator == (A const& other) { return true; } }; struct B : A {}; void f() { B b1, b2; b1 == b2; }

Vitaliy
23.08.2017
14:57:55
Да, но я в ней не один :)
Да, я знаю. Просто смотрю, что имя и фамилия знакомые)) Кажется ты делал доклад, когда ещё Гор по удаленке был.

Antony
23.08.2017
14:58:39
тогда в чем отличие
до с++11 data() мог возвращать не нуль терминированную строку, а c_str() мог аллоуировать память и добивать нолик в конец. Но я/ не знаю имплементаций, которые до с++11 не хранили '\0' в конце. С с++11 и позднее , для std::string data() и c_str() - одно и то же

Constantine
23.08.2017
14:59:55
А чего именно хочется достичь?
Хочется, чтобы нельзя было ошибиться и вызвать == за счет implicit cast аргументов

Antony
23.08.2017
15:01:14
Хочется, чтобы нельзя было ошибиться и вызвать == за счет implicit cast аргументов
Вожно например вот так: struct B : A { bool operator==(const B&) const = delete; } ;

Constantine
23.08.2017
15:02:11
Вожно например вот так: struct B : A { bool operator==(const B&) const = delete; } ;
Если автор класса В задумался над тем, что у класса А есть operator ==, то этой проблемы действительно не будет. Менее месяца назад я выяснил, что я могу случайно не задуматься над этой проблемой при наследовании :)

Antony
23.08.2017
15:02:20
Вожно например вот так: 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
23.08.2017
15:03:31
Вожно например вот так: struct B : A { bool operator==(const B&) const = delete; } ;
Собственно сейчас у меня запрашиваются traits на member == и если он есть проверяется, что сигнатура в точности совпадает. Но мне... достаточно проблематично залезть по-нормальному внутрь контейнеров, например

Google
Constantine
23.08.2017
15:04:40
У меня не получилось написать реализацию обертки, которая вызовет конкретную сигнатуру operator == и только её

Aidar
23.08.2017
15:05:50
У итераторов тоже

Точнее в трейтсах

Antony
23.08.2017
15:07:53
Если автор класса В задумался над тем, что у класса А есть operator ==, то этой проблемы действительно не будет. Менее месяца назад я выяснил, что я могу случайно не задуматься над этой проблемой при наследовании :)
тогда правильнее наверное: * не наследоваться публично * или не наследоваться от базового класса, ф сделать базовый класс членом класса наследника

Constantine
23.08.2017
15:53:35
Хм... вот это скорее похоже на дефект, чем на разумное поведение #include <vector> int main() { bool(*var)(std::vector<int> const&, std::vector<int> const&) = (&operator==); return 0; }

оказывается в этом контексте не выполняется ADL

кому писать репорт? :) санитарам? :)

Vladislav
23.08.2017
16:46:02
Constantine
23.08.2017
16:58:10
В спортлотто
Ну вот скажи мне, Слава. Это по-твоему дефект или так задумано?

Ну или хотя бы что используется для десериализаторов в facebook

Antony
23.08.2017
19:53:43
оказывается в этом контексте не выполняется ADL
Ну так у вас и аргументов то нет: функцию вы же и не вызываете :)

А вообще занятно, завтра посмотрю поподробнее

Ioann V
23.08.2017
20:23:12
Нельзя применить разве ? Вроде к оператору () можно было

На счет других не знаю, проясните :?

Или тут речь о классе предке :?

Страница 1233 из 2477