小编Mir*_*ral的帖子

提升lambda集合大小评估

我有一个形式的功能:

void DoSomething(const boost::function<bool ()>& condition, other stuff);
Run Code Online (Sandbox Code Playgroud)

此函数执行一些工作,仅在条件为真时返回.这个条件已被表达为仿函数参数,因为我想在不同的呼叫站点提供不同的条件.

现在,直接使用它是相当简单的,但它需要声明许多小的一次性函数或函子对象,如果可能的话我想避免使用它们.我一直在关注Boost的lambda库,以寻找可能的方法来消除这些,但我认为我缺少一些基本的东西; 我无法让它做我想做的事.

有一个案子让我感到难过:我有一个std::vector叫做的集合data; 我所追求的条件是当该size()集合达到某个阈值时.从本质上讲,我希望我的condition仿函数在返回时返回true data.size() >= threshold,否则返回false.但是我一直在用lambda语法表达这个问题.

到目前为止我能够提出的最好的(至少编译,但它不起作用)是这样的:

boost::function<bool (size_t)> ge = boost::bind(std::greater_equal<size_t>(),
                                                _1, threshold);
boost::function<size_t ()> size = boost::bind(&std::vector<std::string>::size,
                                              data);
DoSomething(boost::lambda::bind(ge, boost::lambda::bind(size)), other stuff);
Run Code Online (Sandbox Code Playgroud)

在进入时DoSomething,大小为0 - 即使在运行过程中大小增加,调用condition()总是看起来大小为0.追踪它(通过Boost的内部结构有点棘手),而它似乎greater_equal每次condition()评估都会调用它,它似乎没有调用size().

那么我完全搞砸了什么基本的东西?是否有更简单的方式来表达这种事情(同时仍然保持代码尽可能内联)?

理想情况下,我希望尽可能接近C#等效代码流畅度:

DoSomething(delegate() { return data.size() >= threshold; }, other stuff);
DoSomething(() => (data.size() >= threshold), other stuff);
Run Code Online (Sandbox Code Playgroud)

c++ functor boost-lambda boost-functional

3
推荐指数
1
解决办法
334
查看次数

makefile 配方中的 Foreach 模板

给出以下 Makefile 片段:

TOOLS=foo bar

define TOOL_install
install -c $(1) $$(prefix)/bin/$(1)
endef

.PHONY: install
install: all
        $(foreach tool,$(TOOLS),$(eval $(call TOOL_install,$(tool))))
Run Code Online (Sandbox Code Playgroud)

为什么make install打印“对‘安装’无需执行任何操作。” 而不是执行 foreach 指定的命令?(foreach 之前有一个选项卡,我尝试在 TOOL_install 定义中放置一个选项卡;但没有帮助。)

根据make -p安装目标没有命令,这显然不符合预期。

在同一个 makefile 的其他地方,我成功地使用相同的技术来创建整个规则,包括命令配方;我怎样才能在现有规则内实现这项工作?

(如果我替换eval为,info那么它会打印我期望它运行的命令。)

在这个简单的情况下,我可以通过内联命令让它工作:

install: all
        @$(foreach tool,$(TOOLS),install -c $(tool) $(prefix)/bin/$(tool) ; )
Run Code Online (Sandbox Code Playgroud)

但我想知道如何让第一个表单按预期工作,以防我将来需要更复杂的东西。

linux foreach makefile gnu-make

3
推荐指数
2
解决办法
2万
查看次数

多路复用器比其他逻辑更"昂贵"吗?

这主要是出于好奇.

我最近一直在研究的一些VHDL代码中的一个片段类似于以下内容:

led_q <= (pwm_d and ch_ena) when pwm_ena = '1' else ch_ena;
Run Code Online (Sandbox Code Playgroud)

当然,这是一种多模式表达.但它也等同于以下基本逻辑表达式(至少在忽略非二进制状态时):

led_q <= ch_ena and (pwm_d or not pwm_ena);
Run Code Online (Sandbox Code Playgroud)

当在FPGA中实际实现时,逻辑利用率或效率方面的"比"更好吗?是否最好使用一个而不是另一个,或者编译器是否足够智能以自己选择"最佳"?

(好奇的是,表达式的目的是定义LED的状态 - 如果ch_ena为假,它应该始终关闭,因为通道被禁用,否则它应该是固定的或根据闪烁pwm_d,根据pwm_ena(PWM启用).我认为第一种形式比第二种形式更明显地描述了这一点,尽管实现第二种形式并不太难.)

synthesis fpga vhdl xilinx

2
推荐指数
1
解决办法
124
查看次数

.gitignore 双星无法从中间目录递归工作?

使用 git 版本 2.34.0.windows.1

我的存储库的根目录中有一个/.gitignore文件,其中通常有扩展名被忽略的嫌疑(这里并不真正相关)。

在树的中间 ( /a/b/c/.gitignore),我有另一个文件,我想说“在该目录下递归,忽略任何名为 的目录devl,除了直接在其中的一个特定文件扩展名”。所以我制定了以下规则:

devl/**
!devl/*.dat
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎不起作用——git 仍然将文件报告/a/b/c/d/devl/test/foo.bar为未跟踪,而不是忽略。(它根本不会忽略目录树中的任何内容devl。)

我可以通过使用以下规则来解决这个问题,但据我从文档中可以看出,上述内容应该是合法且有效的:

/**/devl/**
!/**/devl/*.dat
Run Code Online (Sandbox Code Playgroud)

为什么是这样?这是错误还是误解?

git gitignore

0
推荐指数
1
解决办法
1034
查看次数