小编Nic*_*mer的帖子

零与基类析构函数的规则

我有一个基类Base和一个派生类D,我想为我自动生成移动构造函数和移动赋值运算符.遵循Zero规则,我将所有内存管理留给编译器,只使用level-2类(没有原始指针,数组等):

#include <iostream>

class Base{
  public:
    Base(): a_(42) {}
    virtual void show() { std::cout << "Base " << a_ << std::endl; }

  private:
    int a_;
};

class D : Base {
  public:
    D(): b_(666) {}
    void show() { std::cout << "D " << b_ << std::endl; }

  private:
    int b_;
};

int main() {
  Base b;
  b.show();
  D d;
  d.show();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这应该是吧,对吗?

输入C++核心指南:

基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.

啊,所以我想我必须添加一个析构函数Base.但这将取消自动生成的移动功能!

什么是干净的出路?

c++ c++11 rule-of-zero

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

CMake include() 与 find_package() 的默认搜索路径

我在我的 Debian 机器上安装了 VTK6,它将所有的 CMake 文件放在

$ ls /usr/lib/cmake/vtk-6.3/
[...]
VTKConfig.cmake
vtkModuleAPI.cmake
[...]
Run Code Online (Sandbox Code Playgroud)

当我做

find_package(VTK)
Run Code Online (Sandbox Code Playgroud)

在另一个项目中,一切正常。然而,

include(vtkModuleAPI)
Run Code Online (Sandbox Code Playgroud)

产生错误

include could not find load file:

  vtkModuleAPI
Run Code Online (Sandbox Code Playgroud)

我一直认为find_package()include共享相同的搜索路径,特别是CMAKE_MODULE_PATH. 显然这是不正确的。

注意

SET(CMAKE_MODULE_PATH "/usr/lib/cmake/vtk-6.3")
include(vtkModuleAPI)
Run Code Online (Sandbox Code Playgroud)

确实有效。

另请注意,我使用的是 CMake 3.5,因此不再FindVTK.cmake 像以前那样使用.

什么是默认的搜索路径find_package()include()?为什么vtkModuleAPI.cmake找不到?

cmake

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

cout矢量std :: any

我有一个std::vectorstd::any,所有这些都可以通过被印刷<<(例如,仅整型和浮点).我喜欢有类似的东西

#include <experimental/any>
#include <iostream>
#include <vector>

int main() {
  std::vector<std::experimental::any> v;

  v.push_back(1);
  v.push_back(3.14);

  for (const auto& a: v) {
    std::cout << a << std::endl;
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为std::any不知道<<:

error: no match for ‘operator<<’
Run Code Online (Sandbox Code Playgroud)

到目前为止,我提出的唯一解决方法是将向量项明确地转换为其中可能包含的任何数据类型,例如,

#include <experimental/any>
#include <iostream>
#include <vector>

int main() {
  std::vector<std::experimental::any> v;

  v.push_back(1);
  v.push_back(3.14);

  for (const auto& a: v) {
    try {
        std::cout << std::experimental::any_cast<int>(a) << std::endl;
    } catch (const std::experimental::fundamentals_v1::bad_any_cast&)
    {}

    try {
        std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ c++17

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

可变数量的从属嵌套循环

鉴于两个整数nd,我想构建长度的所有非负元组的列表d是总结到n,包括所有排列.这类似于整数分区问题,但解决方案要简单得多.例如 d==3:

[
    [n-i-j, j, i]
    for i in range(n+1)
    for j in range(n-i+1)
]
Run Code Online (Sandbox Code Playgroud)

这可以很容易地扩展到更多尺寸,例如d==5:

[
    [n-i-j-k-l, l, k, j, i]
    for i in range(n+1)
    for j in range(n-i+1)
    for k in range(n-i-j+1)
    for l in range(n-i-j-l+1)
]
Run Code Online (Sandbox Code Playgroud)

我现在想制作d,即嵌套循环的数量,一个变量,但我不知道如何嵌套循环.

任何提示?

python nested-loops integer-partition

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

pip 无法为 scipy 构建轮子

我刚刚下载了新的python 3.8,我正在尝试scipy使用以下方法安装软件包:

pip3.8 install scipy
Run Code Online (Sandbox Code Playgroud)

但是构建失败并出现以下错误:

**Failed to build scipy**

**ERROR: Could not build wheels for scipy which use PEP 517 and cannot be installed directly**
Run Code Online (Sandbox Code Playgroud)

我该如何安装它pip?我尝试使用该--no-binary版本:

pip3.8 install --no-binary :all: scipy
Run Code Online (Sandbox Code Playgroud)

但最终出现了一个更可怕的错误:

**ERROR: Command errored out with exit status 1: /Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/8p/01_5ykld02v61rtjl8k_8j200000gp/T/pip-install-wlnk_0jg/scipy/setup.py'"'"'; __file__='"'"'/private/var/folders/8p/01_5ykld02v61rtjl8k_8j200000gp/T/pip-install-wlnk_0jg/scipy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/8p/01_5ykld02v61rtjl8k_8j200000gp/T/pip-record-01j_ddt8/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.**
Run Code Online (Sandbox Code Playgroud)

pip scipy pep python-3.8

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

检查CMake模块是否存在

我想编写一个搜索特定库的CMake脚本; 首先使用CMake的Find_PACKAGE(),如果失败,我会做其他事情.我开始了

FIND_PACKAGE(BLAS)
IF (BLAS_FOUND)
  # do stuff
ELSE()
  # do other stuff
ENDIF()
Run Code Online (Sandbox Code Playgroud)

如果FindBLAS.cmake在系统上可用(通常是这样,至少在最后几个CMake版本中),这种方法很有效.如果寻找更虚假的东西,我首先要检查CMake是否已经有一个模块,即做类似的事情

SET(Spurious_FOUND FALSE)
IF (HAS_MODULE_Spurious)
  FIND_PACKAGE(Spurious)
ENDIF()
IF (Spurious_FOUND)
  # do stuff
ELSE()
  # do other stuff
ENDIF()
Run Code Online (Sandbox Code Playgroud)

怎么判断HAS_MODULE_*

cmake

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

模板化类:检查编译时是否复杂

我有一个用A模板化的类,该类Scalar可以是实数值或复数值。它具有realPart应该返回数字的实部的方法。如果Scalar为实值,则应返回原始标量,并且.real()为复杂类型。

写作时

#include <complex>
#include <iostream>

template<class Scalar>
class A {
  public:
    A (const Scalar z):
      z_(z)
    {
    }

    Scalar realPart()
    {
      return z_.real();
    }

  private:
    Scalar z_;
};

int main() {
  A<std::complex<double>> z0((1.0, 2.0));
  std::cout << z0.realPart() << std::endl; // check

  A<double> z1(1.0);
  std::cout << z1.realPart() << std::endl; // mööp
}
Run Code Online (Sandbox Code Playgroud)

编译器会z1.realPart()因为double不知道而抱怨.real()

如何.real()在编译时进行防护?

c++ templates complex-numbers

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

索引具有索引数组的多维数组

我有一个索引元组数组,我想用它从多维numpy数组中挑选出值,

import numpy
a = numpy.random.rand(10, 10, 10)
idx = [[1, 1, 2], [0, 3, 7], [9, 8, 4], [9, 9, 9]]
Run Code Online (Sandbox Code Playgroud)

理解[a[i, j, k] for i, j, k in idx]只有在a.ndim知道的情况下才有效.

任何提示?

python arrays numpy multidimensional-array

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

在很多方面评估许多单项式

以下问题涉及x**k * y**l * z**m在许多点评估许多单项式().

我想计算两个numpy数组的"内在能力",即

import numpy

a = numpy.random.rand(10, 3)
b = numpy.random.rand(3, 5)

out = numpy.ones((10, 5))
for i in range(10):
    for j in range(5):
        for k in range(3):
            out[i, j] *= a[i, k]**b[k, j]

print(out.shape)
Run Code Online (Sandbox Code Playgroud)

如果相反,该行将读取

out[i, j] += a[i, k]*b[j, k]
Run Code Online (Sandbox Code Playgroud)

这将是一些内部产品,可用简单的dot或可计算的einsum.

是否有可能只在一条numpy线上执行上述循环?

python arrays numpy

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

卸载使用`pip install .`安装的软件包

从开发存储库安装Python包时,我通常会导航到setup.py找到和执行的任何位置

pip install .
Run Code Online (Sandbox Code Playgroud)

这将安装包$HOME/.local/.尼斯.

如何卸载以这种方式安装的软件包?

python uninstall pip

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