仅在函数中设置一次静态变量

时间:2018-08-11 22:42:24

标签: c++ eigen

所以我想知道是否可以在函数作用域内仅设置一次静态变量。例如,考虑以下功能:

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,我该如何实现呢?

3 个答案:

答案 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);