Size: a a a

2021 February 23

O

Ofee in supapro.cxx
Roy Mustang
Есть код для проверки структуры на наличие метода, вопрос такой, у меня метод update принимает аргумент int, а проверку я делаю через void_t, как мне в следующем коде сказать, что вот этот update кушает один аргумент int
std::void_t<decltype(std::declval<Type>().update())

Знаю, что можно передать просто 0, но есть ли универсальный способ или может можно как то сделать саму проверку универсальной?
std::declval<int>()
источник

RM

Roy Mustang in supapro.cxx
Ofee
std::declval<int>()
Ага, сработало, а как можно этот метод для проверки классов сделать универсальным? Чтоб я мог передать имя метода и его типы, что-то типа has_function_v
источник

RM

Roy Mustang in supapro.cxx
Хотя без макросов такое не провернуть скорее всего
источник

O

Ofee in supapro.cxx
Roy Mustang
Есть код для проверки структуры на наличие метода, вопрос такой, у меня метод update принимает аргумент int, а проверку я делаю через void_t, как мне в следующем коде сказать, что вот этот update кушает один аргумент int
std::void_t<decltype(std::declval<Type>().update())

Знаю, что можно передать просто 0, но есть ли универсальный способ или может можно как то сделать саму проверку универсальной?
Не рекомендую использовать именно 0 как константу (хотя 42 вполне вариант) для этого. 0 — не int слишком перегружен в языке. Может найти update, принимающий указатель или провалить проверку из-за наличия двух перегрузок
источник

O

Ofee in supapro.cxx
Roy Mustang
Ага, сработало, а как можно этот метод для проверки классов сделать универсальным? Чтоб я мог передать имя метода и его типы, что-то типа has_function_v
Вариант №1 — is_detected (сам можешь запилить имплементацию, чтобы не тянуть из experimental), вариант №2 — hana::is_valid (пример прямо в readme)

И вариант №0, который и следует выбрать — концепты из C++20
источник

RM

Roy Mustang in supapro.cxx
а можно в using тип указать что то вроде void ?
источник

RM

Roy Mustang in supapro.cxx
Допустим у меня где то метод изменился и раньше принимал int, а теперь ничего не принимает и чтоб код не менять, я просто хочу using'у void задать, чем такое провернуть можно?
источник

O

Ofee in supapro.cxx
Roy Mustang
Допустим у меня где то метод изменился и раньше принимал int, а теперь ничего не принимает и чтоб код не менять, я просто хочу using'у void задать, чем такое провернуть можно?
Я не понял ни суть вопроса, ни контекст, так что нужно больше пояснений, чтобы кто-то мог ответить на него
источник

RM

Roy Mustang in supapro.cxx
Ну вопрос вытекает из вопроса выше, про declval и тому подобное. Хочу вот типы вынести в отдельный using, чтоб не лезть в дебри кода decltype(... declval....), и вот представил ситуацию, что я в будущем изменил аргументы, которые принимаются методом, достаточно по сути пойти в using и там заменить, но что делать если я убрал из метода аргументы? я же не могу написать
using update_args_t = std::declval<void>();
источник

RM

Roy Mustang in supapro.cxx
В общем, мне надо чтоб этот способ проверки метода был рабочим в двух случаях: когда метод имеет N аргументов и когда он их не имеет вообще, как можно это дело заставить работать с использованием using'а, как типа передаваемого в declval, который передается в метод, который проверяется на существование
источник

O

Ofee in supapro.cxx
Roy Mustang
Ну вопрос вытекает из вопроса выше, про declval и тому подобное. Хочу вот типы вынести в отдельный using, чтоб не лезть в дебри кода decltype(... declval....), и вот представил ситуацию, что я в будущем изменил аргументы, которые принимаются методом, достаточно по сути пойти в using и там заменить, но что делать если я убрал из метода аргументы? я же не могу написать
using update_args_t = std::declval<void>();
Хочешь странного (потому что может отличаться не только тип единственного аргумента, но и количество аргументов, у каждого из которых может быть отличный от других тип...). Это не универсально

Если всё же считаешь, что это обоснованно — тебе придётся усложнить реализацию проверки наличия функции и иметь специализацию под void, для которой отличается проверка. Вероятно, ты бы хотел P0146, но увы
источник

RM

Roy Mustang in supapro.cxx
Ofee
Хочешь странного (потому что может отличаться не только тип единственного аргумента, но и количество аргументов, у каждого из которых может быть отличный от других тип...). Это не универсально

Если всё же считаешь, что это обоснованно — тебе придётся усложнить реализацию проверки наличия функции и иметь специализацию под void, для которой отличается проверка. Вероятно, ты бы хотел P0146, но увы
хм, я попробовал сделать обще только структуры для проверок, а вот bool для каждого метода, но почему то ругается, что не так?
https://onlinegdb.com/SyxY40bMd
источник

RM

Roy Mustang in supapro.cxx
Если обернуть using'и в std::void_t и в struct has_type_fn убрать std::void_t то все работает
источник

O

Ofee in supapro.cxx
Roy Mustang
Если обернуть using'и в std::void_t и в struct has_type_fn убрать std::void_t то все работает
struct has_type_fn<Type, Func, std::void_t<Func>>?
источник

RM

Roy Mustang in supapro.cxx
Ofee
struct has_type_fn<Type, Func, std::void_t<Func>>?
Почему это?
источник

RM

Roy Mustang in supapro.cxx
аа все понял
источник

O

Ofee in supapro.cxx
Roy Mustang
аа все понял
Но у тебя всё-равно неправильная реализация получилась. Следующий код падает с ошибкой:
if constexpr (has_update_v<my_struct>) { }

Лучше возьми готовую реализацию is_detected, иначе отлаживать неожиданные вещи будешь неожиданно и в неожиданных местах (с неожиданным результатом)
источник

RM

Roy Mustang in supapro.cxx
Ofee
Но у тебя всё-равно неправильная реализация получилась. Следующий код падает с ошибкой:
if constexpr (has_update_v<my_struct>) { }

Лучше возьми готовую реализацию is_detected, иначе отлаживать неожиданные вещи будешь неожиданно и в неожиданных местах (с неожиданным результатом)
Почему падает?
источник

O

Ofee in supapro.cxx
Roy Mustang
Почему падает?
*Падает вместо возврата false, если нет метода update
источник

RM

Roy Mustang in supapro.cxx
Ofee
*Падает вместо возврата false, если нет метода update
источник