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 ответов

42 просмотра

Инстанцирование 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 появляется когда происходит стирания многих несовместимых типов). Так что там не обман а не договоренность)

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта