小编Kan*_* Li的帖子

Ansible通知处理程序的另一个角色

我可以通过其他角色通知处理程序吗?我该怎么做让ansible找到它?

用例是,例如我想配置一些服务,然后在更改时重新启动它.不同的操作系统可能有不同的文件要编辑,甚至文件格式也可能不同.所以我想把它们放到不同的角色(因为文件格式可能不同,不能通过设置group_vars来完成).但重启服务的方式是相同的,使用service模块; 所以我想把处理程序放到common角色上.

无论如何要实现这一目标?谢谢.

ansible ansible-playbook

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

默认的纯虚析构函数

在C++ 11中,我们可以声明一个自动生成的析构函数:

struct X {
  virtual ~X() = default;
};
Run Code Online (Sandbox Code Playgroud)

此外,我们可以声明析构函数是纯虚拟的:

struct X {
  virtual ~X() = 0;
};
Run Code Online (Sandbox Code Playgroud)

是我的问题:要如何声明析构函数自动生成纯虚?看起来以下语法不正确:

struct X {
  virtual ~X() = 0 = default;
};
Run Code Online (Sandbox Code Playgroud)

这两个都不是:

struct X {
  virtual ~X() = 0, default;
};
Run Code Online (Sandbox Code Playgroud)

也不是这个:

struct X {
  virtual ~X() = 0 default;
};
Run Code Online (Sandbox Code Playgroud)

编辑:对问题的目的进行一些澄清.基本上我想要一个类是不可实例化的基类,但派生类是可实例化的,那么该类必须具有纯虚拟析构函数.但另一方面,我不想在.cpp文件中提供定义.所以我需要某种相当于的机制default.我想知道是否有人有想法解决这个问题.

c++ c++11

33
推荐指数
1
解决办法
6442
查看次数

默认析构函数nothrow

以下代码不在gcc-4.7.1下编译,而是在clang-3.2下编译.哪一个遵循C++ 11标准?

struct X {
  virtual ~X() = default;
};

struct Y : X {
  virtual ~Y() = default;
};
Run Code Online (Sandbox Code Playgroud)

gcc-4.7.1抱怨说:

looser throw specifier for 'virtual Y::~Y()'
error: overriding 'virtual X::~X() noexcept(true)'
Run Code Online (Sandbox Code Playgroud)

显然,gcc-4.7.1认为X的默认析构函数是nothrow,但是Y的默认析构函数并不是没有.为什么是这样?任何人都可以参考标准中的正确位置吗?谢谢.

我在stackoverflow上看到了类似的问题,但我没有看到参考标准的答案.

c++ c++11

32
推荐指数
1
解决办法
3598
查看次数

抛出constexpr功能

下面的代码在clang ++ 3.7.0下编译,但被g ++ 5.3.1拒绝.两者都有-std=c++14选择权.哪个编译器正确?有谁知道标准在哪里谈论这个?谢谢.

#include <stdexcept>
using namespace std;

constexpr int f(int n) {
  if (n <= 0) throw runtime_error("");
  return 1;
}

int main() {
  char k[f(1)];
}
Run Code Online (Sandbox Code Playgroud)

产量

[hidden] g++ -std=c++14 c.cpp 
c.cpp: In function ‘constexpr int f(int)’:
c.cpp:7:1: error: expression ‘<throw-expression>’ is not a constant-expression
 }
 ^
[hidden] clang++ -std=c++14 c.cpp 
[hidden] 
[hidden] g++ -v
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release …
Run Code Online (Sandbox Code Playgroud)

c++ gcc constexpr c++14

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

为什么不能在类中引用声明的朋友类?

以下代码无法编译:

struct X {
  friend class Y;
  Y* ptr;
};
Run Code Online (Sandbox Code Playgroud)

cppreference描述的情况为

...如果尚未声明友元声明中使用的类的名称,则会在现场进行前向声明.

如果"spot"表示声明朋友关系的位置,则声明该成员应该没问题Y* ptr.为什么不编译?标准中的哪个地方禁止这个?

c++ friend

27
推荐指数
1
解决办法
1324
查看次数

如何有效地使用std :: atomic

std :: atomic是c ++ 11引入的新功能,但我找不到很多关于如何正确使用它的教程.那以下的做法是否通用又高效?

我使用的一种做法是我们有一个缓冲区,我想在一些字节上使用CAS,所以我做的是:

uint8_t *buf = ....
auto ptr = reinterpret_cast<std::atomic<uint8_t>*>(&buf[index]);
uint8_t oldValue, newValue;
do {
  oldValue = ptr->load();
  // Do some computation and calculate the newValue;
  newValue = f(oldValue);
} while (!ptr->compare_exchange_strong(oldValue, newValue));
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 上面的代码使用丑陋的reinterpret_cast,这是检索引用位置&buf [index]的原子指针的正确方法吗?
  2. 单个字节上的CAS是否明显慢于机器字上的CAS,因此我应该避免使用它?如果我更改它以加载一个字,提取字节,计算并设置新值中的字节,并执行CAS,我的代码看起来会更复杂.这使代码更复杂,我还需要自己处理地址对齐.

编辑:如果这些问题依赖于处理器/体系结构,那么x86/x64处理器的结论是什么?

c++ c++11

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

gdb不停地附加到进程

每次我使用gdb附加到进程时,它都会停止目标程序,我需要输入'cont'才能让它继续运行.有没有办法在不停止的情况下附加到流程?如果进程停止一段时间后,进程的行为会有所不同,这会使事情变得更容易.

gdb

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

不同类型的三元运算符

下面的代码在g ++ 4.9.2和clang ++ 3.7.0下表现不同.哪一个是正确的?标准中的哪一部分与此相关?谢谢.

#include <iostream>
using namespace std;

struct Base {
  Base() = default;
  Base(const Base&) = default;
  Base(Base&&) = delete;
};

struct Derived : Base {
};

int main() {
  const Base& b = true ? Derived() : Base();
}
Run Code Online (Sandbox Code Playgroud)

g ++接受它并且clang ++给出错误incompatible operand types ('Derived' and 'Base').请参阅下文了解详情.

[hidden]$ g++ -v
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.9.2/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++14

17
推荐指数
1
解决办法
2841
查看次数

在Python中进行系统调用

我想syscall在Python中制作并且函数不在libc,有没有办法在Python中做到这一点?

更具体地说,我想打电话getdents,其联机帮助页说

注意:这些系统调用没有glibc包装器;

所有现有的相关解决方案我发现在网络上使用ctypeslibc.so:为例子.

请不要质疑我为什么要getdents直接使用,我有一个非常具体的理由这样做,在这个问题上讨论会分散注意力.谢谢.

python system-calls python-2.7

17
推荐指数
1
解决办法
8188
查看次数

完美转发对象成员

假设我有两个structs:

struct X {};
struct Y { X x; }
Run Code Online (Sandbox Code Playgroud)

我有功能:

void f(X&);
void f(X&&);
Run Code Online (Sandbox Code Playgroud)

我怎样写一个函数g()是需要Y&Y&&只有完美的转发X&X&&f(),分别为:

template <typename T>
void g(T&& t) {
  if (is_lvalue_reference<T>::value) {
    f(t.x);
  } else {
    f(move(t.x));
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码说明了我的意图,但随着参数数量的增加,它的可扩展性不高.有没有办法让它完美转发并使其可扩展?

c++ rvalue-reference perfect-forwarding c++11

16
推荐指数
1
解决办法
888
查看次数