SFINAE перегрузка по сигнатуре Callable-объекта

86
14 февраля 2018, 11:45

Ребята, помогите написать перегруженную функцию, которая принимает на вход произвольный 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

Answer 1

Вроде не так уж и сложно:

#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

READ ALSO
Подключение cpp файла

Подключение cpp файла

Работаю в visual studioНашел библиотеку с большими числами:bigint, но не понимаю как ее правильно подключить и использовать

41
Стили в Qt применяются не корректно

Стили в Qt применяются не корректно

Вопрос такой, почему когда прописываю стили в таблице стилей styleqss вот таким способом, то стили не применяются:

47
Парсинг строки C

Парсинг строки C

Привет всемЕсть необходимость парсить строку следующего вида: -f 1000 -d 10 -f 90 Необходимо такую строку спарсить (независимо от расположения аргументов),...

31