我意识到减少仅适用于C++中的POD类型.您将如何实现复杂类型累加器的减少?
complex<double> x(0.0,0.0), y(1.0,1.0);
#pragma omp parallel for reduction(+:x)
for(int i=0; i<5; i++)
{
x += y;
}
Run Code Online (Sandbox Code Playgroud)
(注意到我可能已经遗漏了一些语法).似乎一个明显的解决方案是将实部和虚部分成临时双重,然后积累在那些上.我想我正在寻找优雅,这似乎......不仅仅是漂亮.这是典型的方法吗?
我正在重构旧代码,我想解决的一个问题是处理错误的方式.我很清楚异常以及它们是如何工作的,但我并不完全确定它们是我正在尝试处理的情况的最佳解决方案.
在这段代码中,如果事情没有验证,那么解开堆栈真的没有理由或优势.我们完成了.尝试保存船只没有意义,因为它是一个非交互式代码,通过Sun Grid Engine并行运行.用户无法干预.更重要的是,这些验证失败并不真正代表特殊情况.他们是预料之中的.
那我该如何最好地解决这个问题呢?我不确定自己想要的一件事是每个类方法中的退出点都可能失败.这似乎无法维持.我错了吗?在这样的代码中调用exit()或abort()处于失败点是否可以接受?或者我应该一直抛出一个异常回到main中的一些泛型catch语句?有什么好处?
我无法将单一责任原则与封装协调一致.似乎在类之间分配责任需要暴露大量数据.举个例子,考虑一些叫做的对象DataPoints.DataPoints其中包括x和y坐标.我可以创建一个填充的Generator类DataPoints.现在,假设我想绘制这些数据点.显然,这是一个单独的责任,可能来自一个叫做的类DataPointsPlotter.但是为了绘制数据,我需要知道内部x和y坐标是什么.只需一个处理两个类,这没问题.x和y是内部变量,但create()和print()方法都可以访问这些变量.我可以暴露x和y(也许是通过getter/setters - 呃)或者我可以通过DataPointsPlotter类的结构,但它仍然需要进入x和y.我可以在DataPoints我发送x和y 的类中声明一个Plotter实例.但这仍然是曝光.
在这个例子中,如何使用绘图仪绘制x和y而不违反封装?
language-agnostic encapsulation single-responsibility-principle
在这段代码中:
class myClass
{
...
vector<myThing> thing(10);
vector<myStuff> stuff(10);
...
}
vector<myClass> vecClass(10);
...
vecClass.clear(); /// calls destructor on myClass instances
Run Code Online (Sandbox Code Playgroud)
每个元素vecClass保存10个元素向量的东西和东西.当clear()被调用时,是否会使事物和东西超出范围,从而被正确销毁?或者有什么明确的我必须做的事情?
Boost属性树看起来像是一个用于解析配置文件的优秀库.但是,我无法弄清楚如何处理每个键有多个值的情况.例如,假设我正在指定一个这样的框:
box
{
x -1 1
y -1 1
z -1 1
}
Run Code Online (Sandbox Code Playgroud)
其中x,y和z是框的边界上x,y和z轴分别使用property_tree的INFO格式指定.我在手册中提到使用带有空格的值的引号,但后来我没有看到我可以将这些值作为数字导入.我必须将字符串解析为数字,这似乎首先打败了使用property_tree的目的.我当然可以给每个数字一个关键:
box
{
xlo -1
xhi 1
ylo -1
yhi 1
zlo -1
zhi 1
}
Run Code Online (Sandbox Code Playgroud)
但这似乎很麻烦,并会膨胀我的配置文件.我还注意到我可以在program_options中处理这种情况,但是我失去了嵌套的配置文件功能(是的,我知道我可以使用点符号来"嵌套",但它不一样).
有没有办法导入例如x作为这样的数字列表?
给出以下 Fortran 代码:
integer, parameter :: double = kind(1.0d0)
integer :: integerTest
real(double) :: doubleTest
complex(double) :: complexTest
integer :: testSize
integer :: ierr
integerTest = 0
doubleTest = real(0.d0, kind=double)
complexTest = cmplx(0.d0, 0.d0, kind=double)
call MPI_SIZEOF(integerTest, testSize, ierr)
! ...
call MPI_SIZEOF(doubleTest, testSize, ierr)
! ...
call MPI_SIZEOF(complexTest, testSize, ierr)
Run Code Online (Sandbox Code Playgroud)
使用 Intel MPI 编译时,出现错误:
error #6285: There is no matching specific subroutine for this generic subroutine call. [MPI_SIZEOF]
Run Code Online (Sandbox Code Playgroud)
在线上
call MPI_SIZEOF(complexTest, testSize, ierr)
Run Code Online (Sandbox Code Playgroud)
使用 OpenMPI 编译和执行此代码不会出现任何问题。出现这个错误的原因是什么?看起来它正在寻找 类型的特定匹配complexTest …
C++ std lib中有一个常量,意味着"最大可表示数"和"最小可表示数"吗?在Matlab中,我们有类似的东西EPS,realmax和realmin.我想知道是否有相当于C++的东西.
如果我使用设置通用容器映射boost::any,并使用nullptrC++ 11中的新函数作为类似于isset()类型操作的初始化值,是否存在任何潜在的缺陷?
例如:
std::map<std::string, boost::any> map;
map["A"] = nullptr;
map["B"] = nullptr;
map["C"] = nullptr;
map["D"] = nullptr;
map["A"] = 1;
map["C"] = 3;
// assume error checking, other types, etc.
for(auto k : map) {
if (k.second.type() != typeid(nullptr)) {
std::cout << k.first << " : " << boost::any_cast<int>(k.second) << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
在C++ 11之前,我把它boost::any包装在带有a的结构中bool isset,但这似乎有效.任何陷阱?
当我编译这段代码时:
class Base { /*...*/ };
class Derived : public Base { /*...*/ };
class C
{
public:
template<typename T>
C(T const& inBase) : baseInC(new T(inBase)) { /*...*/ }
template<typename T>
C(T&& inBase) : baseInC(new T(std::move(inBase))) { /*...*/ }
std::unique_ptr<Base> baseInC;
};
int main()
{
Base base;
Derived derived;
C ca(base);
C cb(derived);
C cc( (Base()) );
C cd( (Derived()) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到一个编译器消息:
In instantiation of C::C(T&&) [with T = Base&]': required from C ca(base); error: new cannot …