Шаблонный параметр для std::function
Есть метод шаблонного класса, который в качестве параметра принимает std::function с шаблонным параметром.
#include <functional>
template<typename T>
class A
{
public:
void foo(std::function<void(T&)> func)
{
T t = 0;
func(t);
}
};
int main()
{
A<int> a;
a.foo([]<typename T>(T& t)
{
//some code
});
}
В main пытаюсь вызывать этот метод, но компилятор выдаёт ошибки:
main.cpp: In instantiation of ‘main()::<lambda(T&)> [with T = int]’:
/usr/include/c++/12.1.0/type_traits:2565:26: required by substitution of ‘template<class _Fn, class ... _Args> static std::__result_of_success<decltype (declval<_Fn>()((declval<_Args>)()...)), std::__invoke_other> std::__result_of_other_impl::_S_test(int) [with _Fn = main()::<lambda(T&)>&; _Args = {int&}]’
/usr/include/c++/12.1.0/type_traits:2576:55: required from ‘struct std::__result_of_impl<false, false, main()::<lambda(T&)>&, int&>’
/usr/include/c++/12.1.0/bits/std_function.h:348:9: recursively required by substitution of ‘template<class _Result, class _Ret> struct std::__is_invocable_impl<_Result, _Ret, true, std::__void_t<typename _CTp::type> > [with _Result = std::__invoke_result<main()::<lambda(T&)>&, int&>; _Ret = void]’
/usr/include/c++/12.1.0/bits/std_function.h:348:9: required from ‘struct std::function<void(int&)>::_Callable<main()::<lambda(T&)>, main()::<lambda(T&)>, std::__invoke_result<main()::<lambda(T&)>&, int&> >’
/usr/include/c++/12.1.0/bits/std_function.h:353:8: required by substitution of ‘template<class _Res, class ... _ArgTypes> template<class _Cond, class _Tp> using _Requires = std::__enable_if_t<_Cond::value, _Tp> [with _Cond = std::function<void(int&)>::_Callable<main()::<lambda(T&)>, main()::<lambda(T&)>, std::__invoke_result<main()::<lambda(T&)>&, int&> >; _Tp = void; _Res = void; _ArgTypes = {int&}]’
/usr/include/c++/12.1.0/bits/std_function.h:434:9: required by substitution of ‘template<class _Functor, class _Constraints> std::function<void(int&)>::function(_Functor&&) [with _Functor = main()::<lambda(T&)>; _Constraints = <missing>]’
main.cpp:18:10: required from here
Как было бы правильно реализовать подобное?
UPD: мне кажется, оно не очень хочет принимать шаблон тут: a.foo([]<typename T>(T& t)
Ответы (1 шт):
Автор решения: user509700
→ Ссылка
Вместо шаблона в параметрах лямбды можно напрямую передать int
int main()
{
A<int> a;
a.foo([](int& t)
{
//some code
});
}