忽略const
问题,你有一个先有鸡还是先有蛋的问题。
确实,您的 lambda 可以转换为std::function<std::uint32_t(std::unit32_t)>
.
但 lambda 确实不是std::function<std::uint32_t(std::unit32_t)>
所以编译器无法推断A
.
如果编译器无法推断出A
,无法将 lambda 转换为std::function<A(T)>
.
你显然可以明确正确的std::function
类型调用map()
a.map(std::function<std::uint32_t(std::uint32_t)>{[]( uint32_t c ) -> uint32_t {
return c * c;
}});
并且,考虑到您正在使用 C++17(因此您可以使用推导指南std::function
)还推导出模板参数std::function
a.map(std::function{[]( uint32_t c ) -> uint32_t {
return c * c;
}});
但是,再次使用模板推导指南std::function
, 写作怎么样mat()
接受一个简单的可调用和推论A
从中?
我的意思是...下面的事情怎么样?
template <typename F>
auto map( F && func ) const {
using A = typename decltype(std::function{std::forward<F>(func)})::result_type;
auto sequence = new Sequence< A >;
for ( const T& element : *this ) {
sequence->push( std::forward<F>(func)( element ) );
}
return *sequence;
}
(警告:代码未经测试)。
你还可以推论A
, 没有std::function
演绎指南(C++17 之前的版本),由 Michael Kenzel 建议。