
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

Berkus
23.08.2017
14:10:32

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

Antony
23.08.2017
14:13:42


Constantine
23.08.2017
14:15:04
См 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

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 — ээ... массив?

Constantine
23.08.2017
14:47:34

Aidar
23.08.2017
14:48:03

reagentoo
23.08.2017
14:48:06

Constantine
23.08.2017
14:48:16

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

reagentoo
23.08.2017
14:49:44

Constantine
23.08.2017
14:49:45

Berkus
23.08.2017
14:50:50

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

fox.cpp
23.08.2017
14:51:25

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

Antony
23.08.2017
14:54:57

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

reagentoo
23.08.2017
15:00:13

Antony
23.08.2017
15:01:14

Constantine
23.08.2017
15:02:11

Antony
23.08.2017
15:02:20

Constantine
23.08.2017
15:03:31

Google

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

Aidar
23.08.2017
15:05:50
У итераторов тоже
Точнее в трейтсах

Antony
23.08.2017
15:07:53

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
А вообще занятно, завтра посмотрю поподробнее

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