170 похожих чатов

Народ, помогите пожалуйста с одним важным вопросом - есть ли

в С++ способ проверить внутри if-constexpr может ли некая шаблонная функция быть вызывана с аргументом определенного типа?
Я тут пытаюсь сделать через "if constexpr(requires { fn(obj); })" https://godbolt.org/z/8Ta78YTKG
#include <iostream>

struct Struct1 {
int field;
};
struct Struct2{
int field2;
};

auto obj1 = new Struct1{123};
auto obj2 = new Struct1{234};

auto fn1 = [](auto obj1){
std::cout << "fn1:" << obj1->field << "\n";
};
auto fn2 = [](auto obj2){
std::cout << "fn2:" << obj2->field2 << "\n";
};

auto invokeWithObj(auto obj, auto fn1, auto fn2){
if constexpr(requires{ fn1(obj); }){
fn1(obj);
}
if constexpr(requires{ fn2(obj); }){
fn2(obj);
}
};

int main(){
invokeWithObj(obj1, fn1, fn2);
invokeWithObj(obj2, fn1, fn2);
}
но это не работает и выдает ошибку "error: no member named field2 in Struct1"
То есть if constexpr + requires не срабатывает и компилятор продолжает инстанциирование для второй ветки с типом первого объекта

Существует сейчас ли в С++ способ заставить работать этот пример??? Если requires{ fn(obj); } не работает то может можно как-то через перегрузку (вроде есть еще всякие "detection idiom" подходы). Я хочу вызвать переданный объект либо с первой либо со второй лямбдой в зависимости от того можно ли ее вызвать/проинстанциировать с этим объектом

11 ответов

21 просмотр

Инстанцирование fn1 с неверным типом - всегда hard error. Так что не меняя fn1 придумать ничего нельзя

std::is_invokable?

Богдан- Автор вопроса
Alexander Karaev
Инстанцирование fn1 с неверным типом - всегда hard...

Действительно, работает только с нешаблонными функциями а с шаблонными не работает https://godbolt.org/z/a4Y48ePvo

Богдан- Автор вопроса
Alexander Karaev
Инстанцирование fn1 с неверным типом - всегда hard...

жаль.. и никаких способов (включая самые безумные вроде лупхолов) до сих пор не придумали в С++ сообществе?

Богдан
Действительно, работает только с нешаблонными функ...

ну так примени концепты, с которыми играесся, по назначению — обмажь шаблонную requires'ами чтобы оно неправильные типы не пускало

Богдан- Автор вопроса
Гражданин Котейко
ну так примени концепты, с которыми играесся, по н...

к сожалению из-за отсуствия requires(auto) придется через макрос дублировать тело функции в внутри requires{}-концепта, но в принципе тоже идея

А зачем это? Вызови функцию. Вызовется - ок, код будет работать. Нет - будет работать другая специализация шаблона

Богдан- Автор вопроса
Ilya Zviagin
А зачем это? Вызови функцию. Вызовется - ок, код...

посмотри эту демку https://godbolt.org/z/1KGeb7Gra там в примерах я часто использую макрос if_constexpr(...) чтобы не писать болерплейт а все потому что я не могу при матчинге проверить будет ли лямбда-коллбек вызываться с этим типом или нет

Богдан
посмотри эту демку https://godbolt.org/z/1KGeb7Gra...

В ридми обман, получается, нельзя без __if_constexpr обойтись

Богдан- Автор вопроса
Alexander Karaev
В ридми обман, получается, нельзя без __if_constex...

не совсем, если скопировать тот пример без других примеров то он будет работать (необходимость использовать if-constexpr появляется когда происходит стирания многих несовместимых типов). Так что там не обман а не договоренность)

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Кто может подсказать? Я преобрпзовал изображение в бинарное(у меня установлен трекбар который при установленном значении меняет пиксели на белый если меньше и чёрный если боль...
Константин VS
6
Карта сайта