我有一个基类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.但这将取消自动生成的移动功能!
什么是干净的出路?
我在我的 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找不到?
我有一个std::vector的std::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) 鉴于两个整数n和d,我想构建长度的所有非负元组的列表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 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) 我想编写一个搜索特定库的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_*?
我有一个用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()在编译时进行防护?
我有一个索引元组数组,我想用它从多维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知道的情况下才有效.
任何提示?
以下问题涉及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包时,我通常会导航到setup.py找到和执行的任何位置
pip install .
Run Code Online (Sandbox Code Playgroud)
这将安装包$HOME/.local/.尼斯.
如何卸载以这种方式安装的软件包?
python ×4
c++ ×3
arrays ×2
cmake ×2
numpy ×2
pip ×2
c++11 ×1
c++17 ×1
nested-loops ×1
pep ×1
python-3.8 ×1
rule-of-zero ×1
scipy ×1
templates ×1
uninstall ×1