所以我想知道是否可以在函数作用域内仅设置一次静态变量。例如,考虑以下功能:
void projectPointIntoPlane(const Affine3f& plane2xy, Vector3f& p)
{
static Matrix3f P;
P << Vector3f::UnitX(), Vector3f::UnitY(), Vector3f::Zero();
p = plane2xy.inverse() * P * plane2xy * p;
}
我只想设置一次P,而不是在每次函数调用时都设置P,我该如何实现呢?
答案 0 :(得分:7)
您可以使用finished()
method of CommaInitializer
在声明中将其初始化,而不是先声明P
然后再对其进行初始化:
static const Matrix3f P =
(Matrix3f() << Vector3f::UnitX(), Vector3f::UnitY(),
Vector3f::Zero()).finished();
使用这种方法,您还可以将P
声明为const
。
答案 1 :(得分:5)
您可以使用返回正确值的lambda。由于它在初始化表达式中,因此仅被调用一次:
void projectPointIntoPlane(const Affine3f& plane2xy, Vector3f& p)
{
static Matrix3f P = []{
Matrix3f P;
P << Vector3f::UnitX(), Vector3f::UnitY(), Vector3f::Zero();
return P;
}();
p = plane2xy.inverse() * P * plane2xy * p;
}
答案 2 :(得分:4)
遵循以下原则:
static Matrix3f P;
static bool dummy = (
(P << Vector3f::UnitX(), Vector3f::UnitY(), Vector3f::Zero()),
true);