Автоматический вывод типа шаблона
От: Alexander.Kordonsky Израиль  
Дата: 06.10.20 21:57
Оценка:
Доброго времени суток.

Хотелось бы получить помощь форума в следующем вопросе.

Хочу определить функцию , которая принимает объект 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.

Спасибо
Re: Автоматический вывод типа шаблона
От: reversecode google
Дата: 06.10.20 23:20
Оценка: +1
template <typename Pred>
void g(Pred && pred)
{
}
Re[2]: Автоматический вывод типа шаблона
От: Alexander.Kordonsky Израиль  
Дата: 07.10.20 15:45
Оценка:
Здравствуйте, reversecode, Вы писали:

Спасибо , но я пробовал эту консктрукцию.
Я не понимаю если мне надо потом добраться до типа аргумента , то как это сделать.
Кроме того , данная конструкция может принять вообще любой тип , не обязательно функцию.
Конечно можно это проверит , является ли тип функцией , но хотелось бы , что бы была информация о типе аргумента


R>
R>template <typename Pred>
R>void g(Pred && pred)
R>{
R>}
R>
Re[3]: Автоматический вывод типа шаблона
От: B0FEE664  
Дата: 07.10.20 17:01
Оценка: +1
Здравствуйте, 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>Конечно можно это проверит , является ли тип функцией , но хотелось бы , что бы была информация о типе аргумента

Интересно, а что вы собираетесь делать с этой информацией?
И каждый день — без права на ошибку...
Re[3]: Автоматический вывод типа шаблона
От: night beast СССР  
Дата: 07.10.20 18:38
Оценка:
Здравствуйте, Alexander.Kordonsky, Вы писали:

AK>Спасибо , но я пробовал эту консктрукцию.

AK>Я не понимаю если мне надо потом добраться до типа аргумента , то как это сделать.
AK>Кроме того , данная конструкция может принять вообще любой тип , не обязательно функцию.
AK>Конечно можно это проверит , является ли тип функцией , но хотелось бы , что бы была информация о типе аргумента

а какой тип аргумента у лямбды [obj](auto&& arg) { obj->handle(arg); } ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.