http://en.cppreference.com/w/cpp/algorithm/clamp将此作为可能的实现std::clamp
:
template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp )
{
return assert( !comp(hi, lo) ),
comp(v, lo) ? lo : comp(hi, v) ? hi : v;
}
Run Code Online (Sandbox Code Playgroud)
虽然我确实理解这是如何工作的,但是把断言声明放在回报中对我来说似乎很奇怪; 我会把它写成:
template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp )
{
assert( !comp(hi, lo) );
return comp(v, lo) ? lo : comp(hi, v) ? hi : …
Run Code Online (Sandbox Code Playgroud) 我想有一个QWidget
实例使用a QHBoxLayout
和(理想情况下自动调用某些函数也很好)水平调整大小以适应其内容.水平调整大小就足够了,因为所有小部件(包括容器本身)都具有相同的高度.
用例如下:小部件,我们称之为容器,是浮动的,即不是任何布局的一部分.用户应该能够将具有固定大小的其他小部件(通过调用函数)添加到容器的布局,容器在该布局上增长以适应其新内容.用户还应该能够删除先前添加的小部件,容器再次收缩.在插入第一个窗口小部件时将不会创建容器,并在删除最后一个窗口小部件时删除该容器,即它将始终包含至少一个窗口小部件.
一个例子:添加第一个小部件后,容器看起来像这样,|
左边/右边框:
|<1st widget>|
Run Code Online (Sandbox Code Playgroud)
添加另一个后,它看起来像这样:
|<1st widget> <2nd, longer widget>|
Run Code Online (Sandbox Code Playgroud)
删除第一个小部件后,它看起来像这样:
|<2nd, longer widget>|
Run Code Online (Sandbox Code Playgroud)
我猜想,这应该是一种简单的,但我得到了什么地方丢失了其间的容器的sizeHint
,sizePolicy
,adjustSize()
,它的平面布局的sizeContraint
,以及与explitely设置大小,并迫使更新和基本多次尝试无处(即容器没有调整可言,容器只能增长但不会缩小等).我怀疑我一定错过了一些明显的东西..?
我们正在考虑将Jenkins Pipeline插件用于一个相当复杂的项目,该项目包含几个需要在合并之前使用不同工具(在不同机器上)构建的交付.尽管如此,使用单个数据进行完整构建似乎很容易Jenkinsfile
,我喜欢自动发现管道附带的git分支.
但是,此时,我们为每个交付都有工作,并使用基于构建流程的"元"工作来协调各个工作.关于这一点的好处是,如果只做了很小的改动,它还允许只启动一个单独的工作,只是为了看看这个交付是否仍在编译.
为了模仿这一点,我想到了一些想法:
Jenkinsfile
s进行交付,load
并将它们放在顶层Jenkinsfile
; 似乎Multibranch Pipeline作业不允许配置Jenkinsfile
使用(https://issues.jenkins-ci.org/browse/JENKINS-35415),因此,为单个交付创建作业仍然是开放的.if
为所有交付提供s,Jenkinsfile
以便能够选择应该构建哪些.但是,这会在一个管道中混合不同的构建类型,并且至少会弄乱构建时间的估计.那些可行的选择,还是有更好的选择?
是否有任何可综合的方法将接口传递给函数或任务?我的用例如下:我有一个包含多个函数的包(虽然我可以将它们转换为任务,如果这有帮助:)),所有这些都可能在模块中使用,可能需要访问模块的端口.现在,通常我只是将所有端口分组interface
,将其添加到模块,然后将其传递virtual
给函数.但是,我的综合工具手册提到virtual
不支持.
我错过了什么吗?必须有一种方法为合成任务提供端口,类似于VHDL的signal
参数?
一些示例代码:
module mymod (
input logic clk,
input logic rst,
input uint16_t adr,
input bit cyc,
input uint32_t dat_m,
input bit stb,
input bit we,
output bit ack,
output uint32_t dat_s
);
always_comb begin
mypack::do_something(a, b, c, adr, cyc, dat_m, stb, we, ack, dat_s);
endmodule
Run Code Online (Sandbox Code Playgroud)
理想情况下,任务mypack::do_something
可以将端口用作端口,即等待它们的更改,向它们写入值等; 基本上,你通过传递它们作为signal
参数(而不是variable
或constant
参数)在VHDL中实现的相同.
我正在查看C++ Integer Overflow和Promotion,尝试复制它,最后结束了这个:
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int i = -15;
unsigned int j = 10;
cout << i+j << endl; // 4294967291
printf("%d\n", i+j); // -5 (!)
printf("%u\n", i+j); // 4294967291
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在cout
做什么,我阅读上述职务后预期一样,第二printf
:既打印4294967291.第一printf
,然而,版画-5.现在,我的猜测是,这printf
只是将无符号值4294967291解释为有符号值,最终为-5(这适合看到2的补码4294967291为11 ... 11011),但我不是100 %相信我没有忽视任何事情.那么,我是对的还是其他事情发生在这里?
我正在使用一个类库,其中所有类都直接或间接地从基类派生Base
并具有名称。该库提供了一种按名称搜索对象的工具,该名称将返回一个Base*
.
有没有办法找到返回对象的类型,而无需dynamic_cast
像我在以下示例中那样使用s检查所有可能性?如果可能的话,我想避免这种情况,因为派生类具有模板参数,这带来了很多可能性。
如果我至少能够在不知道模板类型的情况下找出类类型(T1
或者T2
,在下面的示例中),那也很好,即。做类似的事情dynamic_cast<T1<i_dont_care>*>
。
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base() {}
};
template <typename T> class T1 : public Base {};
template <typename T> class T2 : public Base {};
Base *find_by_name() {
return new T2<int>();
}
int main() {
Base *b = find_by_name();
if (T1<int> *p = dynamic_cast<T1<int>*>(b)) {
cout << "T1<int>" << endl;
// do something meaningful with p
} else if …
Run Code Online (Sandbox Code Playgroud) 在正常模式下删除一个字符,Del并将其放在yank缓冲区中.如何更改此行为以保持缓冲区不变?例如,当使用d
命令时,可以将它拉到黑洞缓冲区中吗?
我正在尝试QTreeView
自动调整其内容的大小.这是我的设置:我想创建一个"智能"工具提示这是一个QWidget
有Qt.Tool | Qt.FramelessWindowHint
作为WindowFlags
,这很好地工作.它包含一些布局,其中包含一些按钮(大小不变)和QTreeView
.现在,无论何时将线条添加到QTreeView
模型中,QTreeView
都应自动增加其大小以避免垂直滚动条.
设置QSizePolicy.Expanding
工具提示小部件和QTreeView
没有改变任何东西 - 也许我在这里缺少一些额外的标志或东西.
我也试过以下,蛮力方法:
class ToolTip:
def __init__(self):
...
self.itemView.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
self.itemView.verticalScrollBar().rangeChanged.connect(self.resizeViewVertically)
def resizeViewVertically(self, min, max):
self.resize(self.width(), self.height() + max)
Run Code Online (Sandbox Code Playgroud)
大部分时间都有效,但并非总是如此.每隔一段时间(每隔一段时间,确切地说,但我不知道这是否是巧合),使用此代码,视图正确调整大小(即所有内容都适合,并且不需要滚动条),但滚动条不会消失,允许滚动到最后一行下方的空白区域.
假设我在一个程序中有两个编译单元,每个编译单元都声明一个具有相同签名的非内联函数,但实现不同,例如
// a.cpp
namespace internal {
int foo(int a) {
return a+1;
}
}
int main() {
}
Run Code Online (Sandbox Code Playgroud)
和
// b.cpp
namespace internal {
int foo(int b) {
return b+2;
}
}
Run Code Online (Sandbox Code Playgroud)
编译/链接这个(g++ 4.8.3 with -std=c++11
),我收到错误
b.cpp:(.text+0x0): multiple definition of `internal::foo(int)'
Run Code Online (Sandbox Code Playgroud)
这是相当预期的,因为据我了解,这只是违反了单一定义规则:
odr 使用的每个非内联函数或变量(见下文)的唯一一个定义需要出现在整个程序(包括任何标准库和用户定义库)中。
现在,将 更改namespace internal
为未命名的名称空间,错误就会消失。直观上,这对我来说是有意义的,因为我正在将函数从外部链接更改为内部链接:
在命名空间范围内声明的以下任何名称都具有外部链接,除非该命名空间未命名或包含在未命名命名空间内 (C++11 起):上面未列出的变量和函数(即未声明为 static [... ]) ...
和
[A]所有在未命名命名空间或未命名命名空间内的命名空间中声明的名称,即使是显式声明为 extern 的名称,也具有内部链接。
但是,我无法在一个定义规则中找到任何可以免除具有内部链接的函数的内容。因此,我的问题是:我的直觉推理是否正确,或者我仍然违反具有内部链接的函数的单一定义规则(并且编译器/链接器不再报告它)?此外,标准(或 cppreference.com :)
)在哪里说明它是否可以?