在 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::functions。 使第二个参数成为T 的不可推断上下文,例如bool and_map(std::vector&lt;T&gt; v, typename identity&lt;std::function&lt;bool(T)&gt;&gt;::type fn) @Piotrs。当你的出现时,我只是写了一条评论,提出了相同的解决方案。我觉得这就是。我会留给你发布答案。 哦,你说得对,我在写评论时忘记了这一点;-)。你是对的,这里没有提到这个(简单和常见的)解决方案,这是不幸的。 顺便说一句,std::vector&lt;T&gt; 实际上是std::vector&lt;T, A&gt;,在声明模板时不要忘记分配器的类型 【参考方案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&lt;T&gt;,因此编译器会引发错误。要解决该问题,可以使用 identity 技巧使第二个参数(使用 std::function&lt;bool(T)&gt;)的上下文不可推断:

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 错误:传递的数组未指定现有的静态方法

当没有要指定的确切值“未定义”或“空”时,为 TypeScript 可选参数传递啥? [复制]

具有未指定模板参数的虚拟方法

如何将变量结构类型传递给 C 中的函数

创建具有未指定可变行长度的多维数组(Java)

WebSocketSharp 未找到具有指定路径的 WebSocket 服务