小编Nat*_*ate的帖子

C++ 11中的局部静态变量初始化是否是线程安全的?

我知道这是一个经常被问到的问题,但由于有很多变种,我想重新陈述它,并希望有一个反映当前状态的答案.就像是

Logger& g_logger() {
    static Logger lg;
    return lg;
}
Run Code Online (Sandbox Code Playgroud)

变量lg的构造函数是否保证只运行一次?

我从以前的答案中知道,在C++ 03中,这不是; 在C++ 0x草案中,这是强制执行的.但我想要一个更明确的答案

  1. 在C++ 11标准(非草稿)中,线程安全的初始化行为是否已完成?
  2. 如果以上是肯定的,那么在当前最新版本的热门编译器中,即gcc 4.7,vc 2011和clang 3.0,它们是否正确实施?

c++ thread-safety c++11

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

覆盖YAML子项

说我有以下YAML文件:

-
   key1: value
# and so on...
   key99: value
   key100:
      subkey1: value
# and so on...
      subkey100: value
-
   key1: value
# and so on...
   key99: value
   key100:
      subkey1: value
# and so on...
      subkey100: SOME DIFFERENT VALUE
Run Code Online (Sandbox Code Playgroud)

处理大量相同数据的自然方式是使用锚点,并覆盖更改的键.

问题是,这里的子项不同.有没有一种简单的方法来引用key100['subkey100']改变了?或者我必须在每个级别使用一系列锚点?

即,是否有简写:

- &anchor
   key1: value
# and so on...
   key99: value
   key100: &subanchor
      subkey1: value
# and so on...
      subkey100: value
-
   <<: *anchor
   key100:
      <<: *subanchor
      subkey100: SOME DIFFERENT VALUE
Run Code Online (Sandbox Code Playgroud)

yaml

14
推荐指数
1
解决办法
5932
查看次数

从plink获取返回代码?

在DOS批处理脚本中,我正在使用plink在远程(也是Windows)计算机上运行单个命令.以前,此命令仅在本地计算机上运行,​​并依赖返回代码来确定成功.有没有办法通过plink轻松获取此信息?

scripting plink batch-file errorlevel

10
推荐指数
1
解决办法
1万
查看次数

CSRF令牌丢失或不正确,即使我有{%csrf_token%}

我在views.py文件中引用此方法时遇到此错误:

def AddNewUser(request):
    a=AMI()
    if(request.method == "POST"):
        print(request.POST)
       # print(request['newUser'])
       # print(request['password'])
    return render_to_response("ac/AddNewUser.html", {})
Run Code Online (Sandbox Code Playgroud)

但我的其他功能工作得很好.这只是我的HTML文件中的这个按钮不起作用.

<form name="AddNewUser" action="/ac/AddNewUser" method="post"> {% csrf_token %} <input type="submit" name="addNewUser" id="addNewUser" value="Create User"></form>

正如你所看到的,我已经得到了{%csrf_token%},但它仍然没有用.我也知道有些人在他们的settings.py中没有MIDDLEWARE_CLASSES但是我已经正确插入了这个问题.什么可能导致这个问题?错误中唯一的另一行说:"视图函数使用RequestContext作为模板,而不是Context." 但我不知道这意味着什么.

html python django

9
推荐指数
1
解决办法
9161
查看次数

这个模板解析冲突叫什么?

我正在用g ++ 7.3编译这个最小的例子

template<typename T>
struct conflict
{
};

template<typename T>
struct s
{
    int conflict;
};

template<typename T>
bool go()
{
    s<T>* sp;
    return sp->conflict < 0;
}
Run Code Online (Sandbox Code Playgroud)

实际的错误消息不足以揭示:

|| test.cpp: In function ‘bool go()’:
test.cpp|16 col 24| error: type/value mismatch at argument 1 in template parameter list for ‘template<class T> struct conflict’
||   return sp->conflict < 0;
||                         ^
test.cpp|16 col 24| note:   expected a type, got ‘0’
Run Code Online (Sandbox Code Playgroud)

实际上,编译器正在尝试实例化conflict模板而不是比较conflict字段.

这个错误有名字吗?

另外,我通过交换比较来修复它>.有没有更好的办法?

c++ templates name-lookup

9
推荐指数
1
解决办法
163
查看次数

django形成无线电输入布局

什么是"djangoy"方法来解决这个问题:

在我的表单类中,我有一个forms.ChoiceField,它的widget是一个forms.RadioSelect小部件,其中一个选项需要显示一个内联文本输入(也是表单中的一个字段).我没有选择其无线电选择时使用自定义验证来忽略文本字段.渲染时,我希望它显示如下:

<ul>
<li><label for="id_rad_0"><input type="radio" id="id_rad_0" value="none" name="rad" /> No Textbox</label></li>
<li><label for="id_rad_1"><input type="radio" id="id_rad_1" value="one" name="rad" /> One Textbox: <input type="text" name="bar" id="id_bar" /></label></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

但是,我不能简单地在我的模板中生成这个,因为无法公开无线电选择.如果没有将表单紧密地耦合到我的模板,或者将所有表示逻辑放在表单类中,我就看不到这样做的方法.解决这个问题的正确方法是什么?

编辑

我意识到上述可能只是一个模糊的问题,但我不确定我能提供什么其他信息以激励某人帮助我.我是一个比网页设计师更好的后端程序员,而且我一个人在这个项目,所以也许是缺乏教育 - 我所描述的只是糟糕的设计?我应该以不同的方式设计这个吗?我对这里的任何建议都很开放,这将有助于我超越这个.

编辑2

根据请求,当前代码缩短以保存理智,更改名称以保护无辜者:

# forms.py
from myapp.models import RatherComplicatedModel
from django import forms

class RatherComplicatedForm(forms.ModelForm):
    #various and sundry code...
    RADIO_CHOICES = (
        ('none', "No Textbox"),
        ('one', "One Textbox: "),
    )
    # although I've abbreviated the model, 'rad' does not appear in the model;
    # it merely provides …
Run Code Online (Sandbox Code Playgroud)

python django django-forms

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

va_start(等)是否可以重入?

在对具有悠久历史的类进行编辑时,我被架构师的特殊习惯所阻碍,即将他的va_start - > va_end序列包装在互斥锁中.该添加的更改日志(大约在15年前制作,之后未修订)注意到这是因为va_start等.一切都不是可重入的.

我不知道va_start有任何这样的问题,因为我一直以为它只是一些堆栈指针数学的宏.这里有什么东西我不知道吗?如果会出现副作用,我不想更改此代码.

具体来说,有问题的功能看起来很像这样:

void write(const char *format, ...)
{
    mutex.Lock();
    va_list args;
    va_start(args, format);
    _write(format, args);
    va_end(args);
    mutex.Unlock();
}
Run Code Online (Sandbox Code Playgroud)

这是从多个线程调用的.

c++ variadic-functions

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

buildbot在Windows上作为服务

按照他们网站上提出的关于如何在Windows上设置buildbot 的建议后,我留下了最后一个问题 - 我有多个从属设备和一个主设备都安装在一台计算机上(他们现在都是演示奴隶,正在做简单的事情 - 稍后当我们将其中的一部分拆分到他们自己的机器上时这不会是完全相同的问题),那么如何将它们全部作为服务运行?我尝试将所有slave/master目录添加到服务中,我尝试再次运行他们的服务设置工具,但无济于事.

我觉得我错过了一些简单的东西,如果有人能指出我正确的方向,我会非常感激.

windows service buildbot

4
推荐指数
1
解决办法
1476
查看次数

gcc使用嵌套类返回错误

我试图使用我的嵌套类的完全限定名称,如下所示,但编译器无法进行!

template <class T> class Apple {
    //constructors, members, whatevers, etc...
public:
    class Banana {
    public:
        Banana() {
            //etc...
        }
        //other constructors, members, etc...
    };
};

template <class K> class Carrot{
public:
    //etc...
    void problemFunction()
    {
        Apple<int>::Banana freshBanana = someVar.returnsABanana(); //line 85
        giveMonkey(freshBanana);  //line 86
    }
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,编译器说:

Carrot.h:85: error: expected ';' before 'freshBanana'
Carrot.h:86: error: 'freshBanana' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

我原以为使用完全限定名称允许我访问这个嵌套类?它可能会打击我的脸,但到底是什么,我没有看到这里?

c++ gcc templates nested-class

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

C++加法过载模糊

我在我的代码库中遇到了一个棘手的难题.我不知道为什么我的代码会生成此错误,但(例如)std :: string则不然.

class String {
public:
    String(const char*str);
    friend String operator+ ( const String& lval, const char *rval );
    friend String operator+ ( const char *lval, const String& rval );
    String operator+ ( const String& rval );
};
Run Code Online (Sandbox Code Playgroud)

这些的实现很容易想象你自己.

我的驱动程序包含以下内容:

String result, lval("left side "), rval("of string");
char lv[] = "right side ", rv[] = "of string";
result = lv + rval;
printf(result);
result = (lval + rv);
printf(result);
Run Code Online (Sandbox Code Playgroud)

这在gcc 4.1.2中生成以下错误:

driver.cpp:25: error: ISO C++ says that these are …
Run Code Online (Sandbox Code Playgroud)

c++ gcc operator-overloading stdstring

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