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

Привет, вопрос по шаблонам, не могу сформулировать правильный запрос в

SO

Есть такой псевдокод:
int foo(int) { return 0; }
int foo(char) { return 0; }
double bar(double) { return 0.0; }

template<class T>
auto wrap(T t) {
if constexpr(std::is_save_v<T, int>) {
return foo(t);
} else if constexpr(std::is_save_v<T, char>) {
return foo(t);
} else if constexpr(std::is_save_v<T, double>) {
return bar(t);
} else {
...
}
}

Я не хочу в if constexpr дублировать все перегрузки для функции foo или bar, это глупо.
Как сделать вот такое:
template<class T>
auto wrap(T t) {
if constexpr( can_be_called(foo(t)) ) {
return foo(t);
} else if constexpr( can_be_called(bar(t)) ) {
return bar(t);
} else {
...
}
}

Что должно быть на месте can_be_called( )? std::is_constructable вроде не подходит

12 ответов

10 просмотров

Сфинайкой или концептом

Aidar Fattakhov
Сфинайкой или концептом

Только ты точно хочешь unqualified foo?

Alexander-Mironochev Автор вопроса
Aidar Fattakhov
Сфинайкой или концептом

через enable_if? готового хелпера в std нет? я оч не хотел писать структуры и шаблоны

Aidar Fattakhov
Можно не enable_if

decltype(foo(declval<T>()))*=nullptr псевдокод

https://en.cppreference.com/w/cpp/types/is_invocable

Artöm Bakri Al-Sarmini
https://en.cppreference.com/w/cpp/types/is_invocab...

Не то, тут тип нужен, а набор перегрузок не тип

Alexander Mironochev
через enable_if? готового хелпера в std нет? я оч ...

Хелпера нет, потому что ни в функцию, ни в шаблон нельзя передать идентификатор

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Карта сайта