- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 boost::lambda,但我遇到了一个我不知道如何解决的错误。
我觉得这是一个初学者错误,所以请原谅我的无知(而且,我不得不承认,我的懒惰也没有阅读整个 boost lamda 文档)。
似乎在某些情况下使用 boost::bind(或者可能是 boost::lambda::bind?),比 boost::lambda 更适合,但我不确定它是否可以在这里应用。我不想为 if cond(arg1) arg2.insert(arg1) ;
编写一个单独的函数,因为它会破坏目的;我猜它不会比仿函数好多少。
我在工作中使用 VC9 的 boost 1.35。错误出现在 cond()
和 insert()
调用站点:“C2664:无法从‘boost::lambda::placeholder1_type’转换参数 1”
我在我的 cygwin 上用 g++ 复制了这个片段的问题。
#include <boost/function.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/if.hpp>
#include <boost/foreach.hpp>
#include <iostream>
#include <set>
void work( boost::function<void(long)> doAction ) {
long results[] = { 2, 5, 4 };
BOOST_FOREACH( long r, results )
doAction( r );
}
bool cond( long r ) { return r % 2 == 0 ; }
int main() {
using namespace boost::lambda;
std::set<long> myResults;
work(
if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );
BOOST_FOREACH( long r, myResults )
std::cout << r << "\n";
}
g++ 错误:
lambda_test.cpp: In function ‘int main()’:
lambda_test.cpp:21:19: error: cannot convert ‘boost::lambda::placeholder1_type {aka const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >}’ to ‘long int’ for argument ‘1’ to ‘bool cond(long int)’
if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );
^
lambda_test.cpp:21:60: error: no matching function for call to ‘std::set<long int>::insert(boost::lambda::placeholder1_type&)’
if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );
如有任何帮助,我们将不胜感激
谢谢
最佳答案
您将延迟执行与即时评估混合在一起:
boost::ref(myResults).get().insert(_1)
在这里,boost::ref(myResults)
不懒惰,所以.get()
也不是。 boost::ref(myResults).get()
的类型只是 std::set<long> &
, 而那个类型的 insert
成员函数没有采用 Boost Lambda 占位符的重载。
我(不再)精通 Boost Lambda,因为我已经转到它的后继库 Boost Phoenix。这是带有修复的一对一翻译: Live On Coliru
#include <boost/phoenix.hpp>
#include <boost/foreach.hpp>
#include <iostream>
#include <set>
template <typename Action>
void work( Action doAction ) {
long results[] = { 2, 5, 4 };
BOOST_FOREACH( long r, results )
doAction( r );
}
bool cond( long r ) { return r % 2 == 0 ; }
int main() {
namespace phx = boost::phoenix;
using namespace phx::placeholders;
std::set<long> myResults;
work(
if_(phx::bind(cond, _1)) [ phx::insert(phx::ref(myResults), _1) ] );
BOOST_FOREACH( long r, myResults )
std::cout << r << "\n";
}
打印
2
4
我建议查看 Phoenix 函数适配,以避免绑定(bind)表达式:
关于c++ - 无法转换 boost::lambda::placeholder1_type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23607508/
我最近更新了系统macOS Mojave 10.14,遇到了以下问题。我不会通过 gcc(我的版本 8.2)和 clang(7.0)使用++ 进行项目。问题是该程序,据我所知,没有找到标准库并给出了所
我开始阅读有关Elasticsearch的文档,并阅读了Elasticsearch documentation中的_type元数据元素: Elasticsearch exposes a feature
我设置了一个 flex 搜索索引,其中包含每个国家/地区的不同_type映射。 因此,存在“us”,“au”,“uk”等的映射。 每个映射都包括“geo_point”类型的位置映射 在添加不同的_ty
此代码段中使用 thread##_type 的目的是什么?我理解下划线t(_t)作为命名约定来识别类型,下划线类型(_type)也是,通常在typedef 声明。我也理解 macros 中的 ## 表
我有一个 logstash 客户端和服务器。 客户端将带有 logstash udp 输出的日志文件发送到服务器,服务器也运行 logstash 来获取这些日志。在服务器上,我有一个 json 过滤器
我正在重构一些处理多态 belongs_to 关联的代码,该关联可以接收实现单表继承的模型。当前代码遵循 ActiveRecord 文档中的建议 here ,即最好覆盖 attachable_type
来自Rails Guide ,要在一个模型上建立多态关系,我需要为对应的表添加两列。 如下图所示,_id 列用作外键。但是我无法弄清楚 _type 列的用法?它的用途是什么? 最佳答案 _type 列
我把 NoContentPage 中的红屏 '_Type' is not a subtype of type 'Widget' 异常记下了完整的组件代码并调用了 place 到 StatefulWid
C++ 有时使用后缀 _type关于类型定义(例如 std::vector::value_type ),有时_t (例如 std::size_t ),或者没有后缀(普通类,还有像 std::strin
为什么mongoengine要加 _类型 和 _cls 集合的每个文档的字段。 它们都是(键,值)对,并且都包含文档模型类的名称。唯一的区别是 _类型 value 是一个列表,如果涉及某些继承,我认为
从filebeat到Elasticsearch中的_type和type有什么区别? 从查询中查找数据: 看起来,_type是来自索引的doc类型,而type只是我的源数据的一个字段。如果是,为什么fi
我有一些看起来像这样的代码: _TypePtr spType = NULL; . . . // host the CLR and populate that type { BSTR fullN
我在 Rails 应用程序中有以下模型: class User include Mongoid::Document ... end class Admin "User" u._type =
我有一个 Slot 模型,属于 Configuration 模型以及另一个模型: 在 db/migrate/...create_slots.rb 中: t.references :slottabl
我正在尝试使用 cywin 在 win32 机器上构建一些 linux 代码。 我在 ym 编译器中得到以下 VS.net 2003 错误: “c:\cygwin\usr\include\sys_ty
从 Mongoid 文档我看到如果我有以下内容: class Base include Mongoid::Document end class InheritedA < Base end clas
突然,我在 _types.h 中的 typedef 行上收到错误。我怎样才能追踪到这个? #ifdef __GNUC__ typedef __signed char __int8_t; #e
我使用 Spring boot 接收 JMS 消息并使用 cURL 发送它。 这是 Spring 配置: @Bean public MessageConverter jsonJmsMessageCon
我正在使用 Bootstrap v4.1.3 当尝试编辑带有“card”类的元素时,我意识到有一些代码,如 _card.scss 和 _type.scss 向我的元素添加样式,但我没有甚至不知道 Bo
我理解下划线t(_t)是用来标识类型的,下划线type(_type)也是,通常在typedef语句中. 用法是否略有不同(例如,模板使用下划线类型,非模板使用下划线 t)? 为什么不在声明中使用它们?
我是一名优秀的程序员,十分优秀!