Автоматический вывод типа шаблона
От: 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.

Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.