在 C++11 中传递具有未指定参数的函数?
Posted
技术标签:
【中文标题】在 C++11 中传递具有未指定参数的函数?【英文标题】:Pass functions with unspecified parameters in C++11? 【发布时间】:2014-11-13 22:17:52 【问题描述】:所以我有这样的功能:
template <typename T>
bool and_map(vector<T> v, function<bool(T)> fn) ...
我想向它传递一个向量和一个像这样的 lambda 函数:
[](int cell) return(cell != -1);
但我收到一个错误,提示没有使用这些参数的 and_map 实例。
当我这样做时,它会起作用:
template <typename T>
bool and_map(vector<T> v, function<bool(int)> fn) ...
如何在不指定传递函数的参数类型的情况下使其工作?
【问题讨论】:
Lambda 不是std::function
s。
使第二个参数成为T
的不可推断上下文,例如bool and_map(std::vector<T> v, typename identity<std::function<bool(T)>>::type fn)
@Piotrs。当你的出现时,我只是写了一条评论,提出了相同的解决方案。我觉得这就是。我会留给你发布答案。
哦,你说得对,我在写评论时忘记了这一点;-)。你是对的,这里没有提到这个(简单和常见的)解决方案,这是不幸的。
顺便说一句,std::vector<T>
实际上是std::vector<T, A>
,在声明模板时不要忘记分配器的类型
【参考方案1】:
这是接受函子的正确方法:
template <typename T, typename F>
bool and_map(vector<T> v, F fn) ...
【讨论】:
【参考方案2】:将函数声明为:
template <typename T>
bool and_map(std::vector<T> v, std::function<bool(T)> fn)
编译器尝试根据两个参数推导出模板类型参数T
。但是,lambda 表达式 不是 std::function<T>
,因此编译器会引发错误。要解决该问题,可以使用 identity 技巧使第二个参数(使用 std::function<bool(T)>
)的上下文不可推断:
template <typename T> struct identity using type = T; ;
template <typename T>
bool and_map(std::vector<T> v, typename identity<std::function<bool(T)>>::type fn)
return ;
std::vector<int> v;
and_map(v, [](int cell) return(cell != -1); );
这样T
的类型将仅根据第一个参数推导出来,然后用于定义第二个参数的类型。
DEMO
【讨论】:
不可演绎的模板参数?这就是我今天的教训。我在哪里可以获得更多相关信息? @RSahu 非推断上下文部分en.cppreference.com/w/cpp/language/template_argument_deduction 这仍然需要支付本可以避免的类型擦除成本。以上是关于在 C++11 中传递具有未指定参数的函数?的主要内容,如果未能解决你的问题,请参考以下文章
LogicException 错误:传递的数组未指定现有的静态方法