小编std*_*ave的帖子

编译时数组常量

我似乎错过了一些相当基本的东西.我正在尝试在编译时使用const数组成员.

const int list[3] = { 2, 5, 7 };
const int a = list[2]; // this doesn't error?

template<int N1, int N2>
struct tmax {
  enum { value = ((N1 > N2) ? N1 : N2) };
};

const int b = tmax<2,4>::value;
const int c = tmax<list[0],list[1]>::value; // error is here

int main()
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

prog.cpp:10:24: error: 'list' cannot appear in a constant-expression
prog.cpp:10:30: error: an array reference cannot appear in a constant-expression
Run Code Online (Sandbox Code Playgroud)

这是相关的IDEOne链接 …

c++ standards templates compile-time-constant

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

在Windows中自动挂载Docker镜像中c:\ Users以外的主机文件夹

我有一个程序需要在Windows上自动安装和管理一些Docker容器,用户输入最少.

它需要自动设置Docker来挂载任意Windows文件夹.它需要从干净安装执行此操作,其中无法假定已创建Docker VM.

默认情况下,Docker几乎允许C:\ Users中的任何文件夹挂载到其Boot2Docker映像,这反过来使它们可以自己挂载到Docker映像中.

我想要一种从VM外部自动修改默认安装脚本的方法,以便我可以使用其他文件夹,但"VBoxManage.exe运行",copyto等命令不能以任何方式在Boot2Docker上运行,不像其他我有Linux VMs.

因此,在我寻求解决方案时,我偶然发现了py-vb​​ox,它允许您使用VirtualBox API轻松地将键盘事件发送到控制台.它还允许直接控制台会话,但它们就像VBoxManage.exe一样失败.所以,这结束了我发送了很多

echo command >> /c/script.sh
Run Code Online (Sandbox Code Playgroud)

键盘上的命令,以便设置将安装额外卷的脚本.有没有更好的办法?

对于任何可能需要它的人来说,这是一个非常简化的版本.前两位是旧的.bat文件,因此它们适用于任何人.首先,创建我们的docker VM:

set PATH=%PATH%;"c:\Program Files (x86)\Git\bin"
docker-machine create --driver virtualbox my-docker-vm
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" sharedfolder add "my-docker-vm" --name "c/myfolder" --hostpath "c:\myfolder" --automount
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata "my-docker-vm" VBoxInternal2/SharedFoldersEnableSymlinksCreate/c/myfolder 1
Run Code Online (Sandbox Code Playgroud)

然后,必须启动docker VM ...

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm --type=headless my-docker-vm
set PATH=%PATH%;"c:\Program Files (x86)\Git\bin"
docker-machine env --shell cmd my-docker-vm > temp.cmd
call temp.cmd
del temp.cmd
Run Code Online (Sandbox Code Playgroud)

现在,Python脚本的简化版本使用py-vb​​ox通过键盘将简化的安装脚本写入VM:

import virtualbox
script = """\n\
echo if …
Run Code Online (Sandbox Code Playgroud)

python windows docker boot2docker

8
推荐指数
1
解决办法
389
查看次数

在 Python 中,为什么控制台输出偶尔会暂停,直到按下 ctrl-c,我该如何停止?

在进行 Python 开发时,这个问题似乎每周都会出现一次。无论是在 Linux 上的 Bash 还是 cmd.exe 或 Powershell 中,Python 脚本有时会暂停它们的输出,让人相信它们可能已经锁定。按下 ctrl-c 后,控制台输出将恢复,很明显脚本已在后台执行。好像滚动锁被按下了一样。

程序无关紧要,它只能随着时间的推移而重现。您可以运行以下代码片段:

import time

i = 0
while True:
    print i
    i++
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

在接下来的一周左右,控制台将暂停,即使我仍在后台每秒增加。

这不仅仅是我的设计糟糕 - 我不止一次在 Celery 进程和 Django 测试服务器以及我自己的程序中发生过这种情况。通常我只会认为它是一个“麻烦事”,但如果程序实际上非常繁忙,ctrl-c 也可能会意外终止该程序。

我的同事也有这种行为,但似乎没有人知道该怎么做。

有没有人对此有解决方案?

谢谢!

python

7
推荐指数
1
解决办法
1012
查看次数

全局类型转换运算符超载?

我正在编写一些"可移植"代码(意思是它针对Linux上的32位和64位MSVC2k10和GCC),我或多或少地使用它:

typedef unsigned char uint8;
Run Code Online (Sandbox Code Playgroud)

C字符串总是uint8; 这是出于字符串处理的原因.传统代码需要将char编译为signed,因此我无法将编译器开关设置为默认为unsigned.但是,如果我正在处理一个字符串,我不能很好地索引一个数组:

char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];
Run Code Online (Sandbox Code Playgroud)

您无法在运行时索引具有负数的数组,而不会产生严重后果.保持C字符串无符号可以更容易地防止错误.

我真的希望不必每次使用带有char*的函数时继续进行转换(char*),并且还要停止复制类函数以便它们采用其中之一.这尤其令人痛苦,因为字符串常量隐式传递为char*

int foo = strlen("Hello");  // "Hello" is passed as a char *
Run Code Online (Sandbox Code Playgroud)

我想要所有这些工作:

char foo[500] = "Hello!";   // Works
uint8 foo2[500] = "Hello!"; // Works
uint32 len = strlen(foo);   // Works
uint32 len2 = strlen(foo2); // Doesn't work
uint32 len3 = strlen((char *)foo2); // Works
Run Code Online (Sandbox Code Playgroud)

可能需要注意允许这种性质的隐式类型转换,但是,每次使用带有char*而没有强制转换的函数会很好.

所以,我认为像这样的东西会起作用:

operator char* (const uint8* foo) { return (char *)foo; }
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.我无法想办法让它发挥作用.我也找不到任何东西告诉我为什么似乎没有办法做到这一点.我可以看到可能的逻辑 - 像这样的隐式转换可能是导致FAR太多错误的原因 …

c++ overloading

6
推荐指数
1
解决办法
2456
查看次数

Django/PostgreSQL varchar到UUID

我正在尝试将项目从Django 1.7更新到1.9.不幸的是UUIDfield,它使用了varchar内部使用的django-extensions .我正在尝试将这些字段更改uuid为数据库中的类型.

我已经创建了一个自定义迁移,告诉Django迁移将使用自己的SQL来完成它.当我这样做时(列被命名guid)我的问题出现了:

alter table tablename alter column guid type uuid using guid::uuid;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

错误:运算符类"varchar_pattern_ops"不接受数据类型uuid

我对PostgreSQL并不熟悉,而且有点过头了.我可以创建一个CAST或其他东西来解决这个问题吗?我无法弄明白我的意思.

我试图使用这里脚本,它应该处理索引依赖,但我真的在我脑海里.

python sql django postgresql varchar

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

在 Django 1.9 中保存时将用户添加到组

你好,我使用的是 Django 1.9。尝试在创建或保存时将用户添加到组。使用 user.groups 或 groups.user_set.add 都不起作用,请与下面的 pre-save 和 post-save 混合搭配。

这些答案对我不起作用,所以这不是一个骗局: 在 Django 创建时将用户添加到组将用户
添加到 django 中的组
将用户添加到 Django 中的组

我已经在保存前和保存后处理程序中尝试了这两种方法。

@receiver(pre_save, sender=User)
def user_presave_handler(sender, instance, **kwargs):
    if instance.is_staff and not instance.is_superuser:
        # Grant all permissions
        try:
            instance.groups.add(Group.objects.get(name='staff_user'))
        except Group.DoesNotExist:
            pass

@receiver(post_save, sender=User)
def user_postsave_handler(sender, instance, **kwargs):
    if instance.is_staff and not instance.is_superuser:
        try:
            g = Group.objects.get(name='staff_user')
        except Group.DoesNotExist:
            pass
        else:
            g.user_set.add(instance)
            g.save()
Run Code Online (Sandbox Code Playgroud)

哪里可以混用什么方法,我试过了。我在测试中不使用不止一种方法。点击用户管理页面上的保存按钮后,用户不会显示在组中。

我仔细检查了处理程序是否被调用,用户逻辑是否正确等。

是我做错了什么,还是在 1.9 中改变了一些东西以打破旧方法?

谢谢!

编辑:对于那些询问的人,该组是这样创建的:

group, __ = Group.objects.get_or_create(name='staff_user')

permissions = Permission.objects.all()
for p in …
Run Code Online (Sandbox Code Playgroud)

python django

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

从我的应用程序中关闭 Windows 10 控制台“标记”模式

我有一个用 Python 编写的控制台应用程序。Windows 10 控制台的“标记”模式让我非常沮丧,因为用户在执行诸如切换窗口之类的简单操作时不小心单击了应用程序。我有什么办法可以控制和阻止这种情况吗?

对于那些不了解标记模式的人来说,这是当用户在控制台窗口中选择某些文本时的情况。当程序下次写入stdout时,整个程序被暂停,这非常烦人。

python console-application windows-10

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

Python 字典查找性能,get vs in

这不是过早的优化。我的用例在内部循环的最内部对 dict 的权限进行了双重检查,一直在运行。此外,它在智力上令人厌烦(见结果)。

这些方法中哪个更快?

mydict = { 'hello': 'yes', 'goodbye': 'no' }
key = 'hello'

# (A)
if key in mydict:
    a = mydict[key]
    do_things(a)
else:
    handle_an_error()

# vs (B)
a = mydict.get(key,None)
if a is not None:
    do_things(a)
else:
    handle_an_error()
Run Code Online (Sandbox Code Playgroud)

编辑:这些速度相同。常识告诉我 (B) 应该明显更快,因为它只是 1 次 dict 查找与 2 次,但结果不同。我在挠头。

基准测试的结果平均超过 12 次运行,其中 1/2 是命中,另一半是未命中:

doing in
switching to get
total time for IN:  0.532250006994
total time for GET:  0.480916659037
times found: 12000000
times not found: 12000000
Run Code Online (Sandbox Code Playgroud)

当一个类似的运行(*10 多个循环)没有找到密钥时,

doing …
Run Code Online (Sandbox Code Playgroud)

python performance dictionary

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

将std :: random_shuffle与std :: array一起使用

我有这样的代码:

typedef intptr_t ptr_t;

const int num_elements = 100;
ptr_t *pstr = (ptr_t *)malloc(sizeof(ptr_t) * num_elements);
std::array<ptr_t,num_elements> *parray = new (pstr) std::array<ptr_t,num_elements>;
Run Code Online (Sandbox Code Playgroud)

我希望能够将元素1洗牌到num_elements-2,所以我想使用std :: shuffle.

auto s = parray->begin()++;
auto e = parray->end()--;
std::random_shuffle ( s, e );
Run Code Online (Sandbox Code Playgroud)

我得到一个投诉,没有重载功能.我觉得自己无法看到自己做错了什么,我感到非常愚蠢.我该怎么做?

编辑:由于答案和反馈,它已改为

auto s = parray->begin();
s++;
auto e = parray->end();
std::random_shuffle ( s, e );
Run Code Online (Sandbox Code Playgroud)

但是,在'auto e'上我得到:'auto'的间接级别与'int*'不同

c++ stl std c++11

-1
推荐指数
1
解决办法
781
查看次数