Ребята, помогите написать перегруженную функцию, которая принимает на вход произвольный Callable объект:
template<typename Callable>
/* ... */ foo(Callable &&callable)
{
}
И делает следующие действия:
Для первой перегрузки : Если переданный объект может быть вызван от одного std::string (т.е. если конструкция std::declval<Callable>()(std::declval<std::string>()) валидна), то тип возвращаемого значения foo должен быть выведен как тип возвращаемого значения Сallable(std::string), т.е. decltype(std::declval<Callable>()(std::declval<std::string>()))(std::string). Например, если объект может быть вызван от одного std::string и в результате такого вызова возвращает double, то тип возвращаемого значения foo должен быть double(std::string). Если переданный объект не может быть вызван от одного std::string, то по принципу SFINAE эта перегрузка foo должна отброситься.
Для второй перегрузки : Аналогично, только теперь вместо std::string - int
Говоря простыми словами, мне нужно проверить, можно ли вызвать переданный Callable-объект от одного std::string, и, если да, то вывести "сигнатуру" этого объекта. Если нельзя, то проверить то же самое для одного int
Очень желательно без C++17
Вроде не так уж и сложно:
#include <type_traits>
#include <utility>
#include <string>
#include <iostream>
template<typename Callable> auto
foo(Callable && callable) -> decltype(::std::declval<Callable>()(::std::declval<::std::string>()))
{
::std::cout << "string" << ::std::endl;
return callable(::std::string{});
}
template<typename Callable> auto
foo(Callable && callable) -> decltype(::std::declval<Callable>()(::std::declval<int>()))
{
::std::cout << "int" << ::std::endl;
return callable(int{});
}
int main()
{
::std::cout << foo([](::std::string) { return "test"; }) << ::std::endl;
::std::cout << foo([](int) { return 42; }) << ::std::endl;
}
online compiler
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники