Доброго времени суток.
Хотелось бы получить помощь форума в следующем вопросе.
Хочу определить функцию , которая принимает объект function отличающийся только аргументом.
Определил это следующим образом
template <typename Arg>
void g(std::function<void(const Arg&)>
{
}
Имеется , допустим 2 типа с функциями подходящими под данную сигнатуру и эти функции передаем функции g ;
struct MyIntFunc {
void handle(const int& i)
{
cout << "handle int " << i << endl;
}
}
struct MyFloatFunc {
void handle(const float& i)
{
cout << "handle float" << i << endl;
}
}
Пытаюсь вызвать функцию g следующим образом
MyIntFunc intF ;
MyFloatFunc floatF ;
g([obj = &intF](auto&& arg) { obj->handle(arg); });
Получаю ошибку компиляции
Error C2784 'void g(std::function<void(const Arg &)>)': could not deduce template argument for 'std::function<void(const Arg &)>' from 'main::<lambda_4>'
пытался проверить следующие варианты
function<void(const int&)> f1 = ([obj = &intF](auto&& arg) { obj->handle(arg); });
g(f1) ; // OK
function f2 = ([obj = &intF](auto&& arg) { obj->handle(arg); }); // ERROR
function f2 = ([obj = &intF](const int& arg) { obj->handle(arg); });
g(f2); // OK
auto f3 = ([obj = &floatF ](const float& arg) { obj->handle(arg); });
g(f3) ; // ERROR
g<float>(f3) ; //OK
Хотелось бы, чтобы функция g сама смогла вывесли тип переданной функции без явной специализации.
Вопрос ,
возможно ли это сделать ?
Какие правила автоматического вывода типа работают в данной ситуации ?
Компилятор VS2019 с поддержкой c++17.
Спасибо
template <typename Pred>
void g(Pred && pred)
{
}
Здравствуйте, reversecode, Вы писали:
Спасибо , но я пробовал эту консктрукцию.
Я не понимаю если мне надо потом добраться до типа аргумента , то как это сделать.
Кроме того , данная конструкция может принять вообще любой тип , не обязательно функцию.
Конечно можно это проверит , является ли тип функцией , но хотелось бы , что бы была информация о типе аргумента
R>R>template <typename Pred>
R>void g(Pred && pred)
R>{
R>}
R>
Здравствуйте, Alexander.Kordonsky, Вы писали:
AK>Спасибо , но я пробовал эту консктрукцию.
AK>Я не понимаю если мне надо потом добраться до типа аргумента , то как это сделать.
Зачем? Всякие стандартные функции типа
template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last,
UnaryPredicate p );
этим не занимаются.
AK>Кроме того , данная конструкция может принять вообще любой тип , не обязательно функцию.
А почему нужна обязательно функция? Почему это не может быть объект с
void operator()(T& x);? Чтобы нельзя было соптимизировать лямбду? Тяжёлый вызов через std::function обязателен?
AK>Конечно можно это проверит , является ли тип функцией , но хотелось бы , что бы была информация о типе аргумента
Интересно, а что вы собираетесь делать с этой информацией?