为什么当我们向std::函数发送lambda时,自动模板类型推导不起作用
why auto template type deduction does not work when we send a lambda to std::function?
为什么下面的代码不能编译?
template <class T>
void sort2( std::function<bool(T, T)> sort_func){
}
int main()
{
sort2( [](int l, int r)->bool{return r > l; });
}
error C2784: 'void sort2(std::function<bool(T,T)>)' :
could not deduce template argument for 'std::function<bool(T,T)>'
有没有办法使代码编译没有说模板参数明确?
sort2<int>( [](int l, int r)->bool{return r > l; });
std::function
是一个类型擦除类,它可以在其他类型中键入擦除lambda。
它与lambda的类型无关。
只有几个很好的理由可以推断类型擦除类的类型(主要是重载)。您可能需要的是一个概念要求子句或类似的东西,它将在c++ 1y之后出现,并且比推断std::function
的类型更好地解决问题。
lambda不是std::function
,它需要转换。因此,编译器无法找到与lambda完全匹配的
必须强制将lambda转换为函数或显式设置模板实参。
可以强制转换为函数,例如:
namespace detail
{
template <typename T> struct function_traits {};
template <typename C, typename Res, typename...Args>
struct function_traits<Res (C::*)(Args...)const>
{
using result_type = Res;
using args_tuple_type = std::tuple<Args...>;
};
template <typename C, typename T> struct to_function;
template <typename C, typename... Ts> struct to_function<C, std::tuple<Ts...>>
{
using Ret = typename function_traits<decltype(&C::operator())>::result_type;
std::function<Ret (Ts...)> operator() (C c) const { return c; }
};
}
#define Return(res) decltype res { return res; }
template <typename Lambda>
auto to_function(Lambda lambda)
-> Return((detail::to_function<Lambda, typename detail::function_traits<decltype(&Lambda::operator())>::args_tuple_type>()(std::forward<Lambda>(lambda))))
然后像这样使用:
sort2(to_function([](int l, int r)->bool{return r > l; }));
相关文章:
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- C++ 模板类型检查标准::is_same不起作用?
- 没有类型结构绑定不起作用?
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- 模板参数类型推导在函数对象中不起作用
- 将参考类型作为嵌套模板结构中的模板参数作为模板参数不起作用
- 模板参数在具有相同数据类型的单个类型名的构造函数中不起作用
- 使用具有不同类型不同回报的模板函数不起作用
- 为什么 C++ 从推断的返回类型中去除引用限定符,为什么生存期延长不起作用?
- pybind11:Python 到 C++ 数据类型转换不起作用
- 抽象类型的对象 - 覆盖不起作用吗?
- 完整的模板专用化不起作用:没有与指定类型匹配的函数模板"mysort2"实例 STLests
- lambda函数返回类型不起作用
- 使用初始化列表的 POD 类型初始化不起作用
- StringStream的Str方法将不起作用.(不同类型的串联)(C )
- 为什么我的链接数据类型复制构造函数不起作用?
- 枚举返回类型不起作用 C [错误 C2440]