-
- Можно классы с продвинутой функцией отнаследовать от какой-нибудь
пустышки, а там где надо вызывать сделать if constexpr
(std::is_base_of<B, A>) {} - VladislavS.(02.07.2020 17:02)
- Да, так можно, но идея была в том, что сами классы даны в
ощущениях, и менять в них что-либо нежелательно. - йцyкeн(02.07.2020 17:30)
- Ну если программировать "в ощущениях" да "по понятиям", то "не в
падлу" буде на sovf подсмотреть. :) VladislavS.(409 знак., 03.07.2020 06:57)
- Извиняюсь, sovf - это где? Если я правильно понимаю, ваш вариант
отличается от того, что предложил fk0, использованием
std::enable_if_t и std::is_same вместо std::void_t. То есть
проверяется не только наличие функции, но и соответствие
возвращаемого ей типа? - йцyкeн(03.07.2020 12:49)
- stackoverflow. enable_if_t позволяет специфицировать шаблон HasFoo на true или false. is_same в паре с decltype опредедяют наличие foo. Мне думается, результат is_same уже можно использовать там где нужен вызов foo. Дополнительный шаблон HasFoo скорее для красоты. Мопед не мой, если что :) - VladislavS.(03.07.2020 20:09)
- Извиняюсь, sovf - это где? Если я правильно понимаю, ваш вариант
отличается от того, что предложил fk0, использованием
std::enable_if_t и std::is_same вместо std::void_t. То есть
проверяется не только наличие функции, но и соответствие
возвращаемого ей типа? - йцyкeн(03.07.2020 12:49)
- Ну если программировать "в ощущениях" да "по понятиям", то "не в
падлу" буде на sovf подсмотреть. :) VladislavS.(409 знак., 03.07.2020 06:57)
- Да, так можно, но идея была в том, что сами классы даны в
ощущениях, и менять в них что-либо нежелательно. - йцyкeн(02.07.2020 17:30)
- В общем случае может быть 2-3 подхода перечисленных ниже. В базе
всегда SFINAE -- шаблон откидывается и просматриваются следующие,
если тип в шаблоне не может быть выведен. Сегодня, при
использовании C++17, можно использовать идиому void_t (см. на
cppreference.com) для того, чтобы написать шаблон типа
раскрывающийся по-разному (true/false) если для его параметра можно
или нельзя определить возвращаемое значение искомой функции (через
decltype) которая как будто fk0(3486 знак., 02.07.2020 15:23, ссылка)
- Если можно, ещё раз - для чего нужен void_t? Вроде, и без него
работает, но я всегда в этой
чёрной(извините, неполиткорректно получилось) шаблонной магии не уверен до конца. йцyкeн(28 знак., 06.07.2020 12:58, ссылка)- В данном случае -- ни за чем. Если decltype не сможет вывести тип, то раскроется верхний шаблон. Типовое применение void_t, когда ему пихают несуществующие выражения и типы без decltype. Если так сделать с твоим HasSuperF то будет ошибка компиляции, а с void_t сожрёт и не подавится (на cppreference первый пример применения void_t). - fk0(06.07.2020 13:40)
- Спасибо, буду разбираться. - йцyкeн(02.07.2020 17:31)
- Если можно, ещё раз - для чего нужен void_t? Вроде, и без него
работает, но я всегда в этой
- Без примера не ясно, кто на ком стоял. Про какой параметр речь -
параметр шаблона или передаваемый в функцию? il-2(672 знак., 02.07.2020 14:29)
- Параметром шаблона является класс как тип данных, параметром
функции - объект (экземпляр этого класса). Вот пример. Всё
работает, как ожидается, но для этого в классы A и B пришлось
ввести флаг is_super. Мне бы хотелось этого избежать. йцyкeн(198 знак., 02.07.2020 14:55)
- Гадское форматирование съело продолжение: йцyкeн(173 знак., 02.07.2020 14:57)
- Ты хочешь static_if, которого в C++ в чистом виде нет. constexpr if
это совсем не то, т.к. он
неизбежно будет компилировать невыполняющиеся ветвия сам уже запутался... будет но в случае шаблонов можно использовать не определённые функции/переменные (прошу носом ткнуть в стандарт, кто понимает лучше), более того, результат компиляции может загрязнить имеющие отношение к участвующим типам пространства имён новыми неожиданными функциями -- помнится кто-то fk0(279 знак., 02.07.2020 17:14, ссылка)
- Ты хочешь static_if, которого в C++ в чистом виде нет. constexpr if
это совсем не то, т.к. он
- Гадское форматирование съело продолжение: йцyкeн(173 знак., 02.07.2020 14:57)
- Параметром шаблона является класс как тип данных, параметром
функции - объект (экземпляр этого класса). Вот пример. Всё
работает, как ожидается, но для этого в классы A и B пришлось
ввести флаг is_super. Мне бы хотелось этого избежать. йцyкeн(198 знак., 02.07.2020 14:55)
- Можно классы с продвинутой функцией отнаследовать от какой-нибудь
пустышки, а там где надо вызывать сделать if constexpr
(std::is_base_of<B, A>) {} - VladislavS.(02.07.2020 17:02)