小编drw*_*ode的帖子

如何在c ++ 11中使用可变参数模板生成左关联表达式(又称左折叠)?

我想使用c ++模板使用二进制操作聚合(折叠)多个参数.

这样的模板可以使用如下:

fold<add>(100,10,5) 扩展到 add(add(100, 10), 5)

上面显示的特定扩展是"左侧折叠".扩张add(100, add(10, 5))是"正确的折叠".假设add函数执行简单的整数加法,左右两次折叠产生相同的结果,115.

但考虑div执行整数除法(div(a,b)=a/b)的函数.在这种情况下,关联性很重要,左右折叠会产生不同的结果:

fold_left<div>(100,10,5)  --> div(div(100, 10), 5) --> div(10, 5) -->  2
fold_right<div>(100,10,5) --> div(100, div(10, 5)) --> div(100, 2) --> 50
Run Code Online (Sandbox Code Playgroud)

使用可变参数模板生成右关联版本(fold_right)很简单,但我无法弄清楚如何生成左关联版本(fold_left).以下尝试实现会fold_left导致编译器错误:

#include <iostream>

template <typename T> using binary_op = T(*)(const T& a, const T& b);

// The terminal (single-argument) cases of the variadic functions defined later. 
template<typename T, binary_op<T> Operation> inline T fold_right(const T& …
Run Code Online (Sandbox Code Playgroud)

c++ templates fold variadic-templates c++11

11
推荐指数
1
解决办法
607
查看次数

使用键绑定在 VSCode 中执行预定义的查找替换全部

我似乎找不到可以从 VSCode 键绑定运行的记录命令的良好列表。

在在线 VSCode 文档中,命令指南列出了两种发现命令的方法:

键盘快捷键的命令通常是不带参数的“简单”命令。“高级命令 api”似乎缺少一些非常基本的命令。

例如,在VSCode 键绑定页面上有一个名为“命令参数”的部分,其中包含以下示例条目:

{ "key": "enter", "command": "type",
  "args": { "text": "Hello World" },
  "when": "editorTextFocus" }
Run Code Online (Sandbox Code Playgroud)

但我没有看到任何地方type记录了该命令。所以我假设可能存在其他几个类似的基本命令,但我不知道在哪里可以找到它们的文档。

不管怎样,我现在真正想要的是一个命令,我可以运行它来在当前编辑器中进行预定义的搜索和替换,指定查找文本、替换文本和选项...如下所示:

{ "key": "ctrl+shift+8", 
  "command": "findReplaceAll",
  "args": { 
    "findText": "Company(\\w+)", 
    "replaceText": "User$1"
    "options": { "ignoreCase": false, "wholeWord": true, "regex": true }
  },
  "when": "editorTextFocus" }
Run Code Online (Sandbox Code Playgroud)

findReplaceAll但我在文档中找不到任何这样的命令或类似的东西,但肯定这样的东西一定存在,对吧?

谢谢!

key-bindings visual-studio-code vscode-extensions

11
推荐指数
2
解决办法
2146
查看次数

GNU make 总是认为一个非文件目标被重新制作(可能的错误?)

Make是否应该始终重新制作具有先决条件但不指向文件且没有配方的目标?或者,如果需要重新制作一个或多个先决条件,Make应该只重新制作此类目标吗?

例如,在下面显示的 Makefile 中,我添加了一个名为的目标objects,该目标具有先决条件,但不指向文件。调用主要目标program取决于objects(以及可能的其他先决条件)。

file1 file2 file3: ;       touch $@

objects: file1 file2

program: objects  file3 ;  @echo 'Making $@'
Run Code Online (Sandbox Code Playgroud)

我的期望是,何时make program运行并且不需要重新制作文件先决条件(即文件 1、文件 2 和文件 3 都存在),program不应重新制作。

然而,实际的 GNU Make行为是program始终运行的配方(无论先决条件文件如何)。这是因为objects总是被认为是重新制作的,这会强制重新制作任何依赖项(即program)。

您可以通过运行来验证这一点:make --trace -d --no-builtin-rules program并且您会看到Make总是输出“ Must remake target 'objects'。 ” Soobjects总是“remade”(即使它没有配方)并且它总是被认为是新更新的。

这很可能是因为objects不指向真实文件。但我期待因为它没有配方,只要不需要重新制作它的先决条件,它就不会被重新制作。

这是预期的行为还是错误?

GNU进行手动状态:

如果规则没有先决条件或配方,并且规则的目标是一个不存在的文件,则 make 会认为该目标在其规则运行时已更新。这意味着依赖于该目标的所有目标将始终运行其配方。

但该描述不适用于上述情况,因为objects目标 …

makefile gnu-make

5
推荐指数
1
解决办法
1046
查看次数

在PostScript中,定义一个过程来定义其他过程

这个问题的目的是从编程的角度更好地理解 PostScript。下面描述的目标只是用于说明的示例。

在PostScript语言中,我可以定义一个过程来设置当前图形颜色,如下所示:

/cRED { 1 0 0 setrgbcolor } def  % define a procedure to set the color to red.
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以定义一个可以定义其他颜色过程的过程。假设cdef定义了这样一个名为的过程。我可以按如下方式使用它:

/cRED 1 0 0 cdef
Run Code Online (Sandbox Code Playgroud)

这应该与之前的 cRED 定义具有相同的效果。问题是我似乎无法弄清楚如何在传递给 的过程中“捕获”堆栈上项目的字面值def

我尝试了以下方法:

/cdef { /B exch def /G exch def /R exch def { R G B setrgbcolor } bind def } def
/cRED 1 0 0  cdef
/cGRN 0 1 0  cdef 
/cBLU 0 0 1  cdef
Run Code Online (Sandbox Code Playgroud)

我的期望是通过使用和bind的值可以按字面意思捕获。即我期望上面的代码与此等效:R GB

/cRED { …
Run Code Online (Sandbox Code Playgroud)

postscript

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