用宏遮蔽void*指针的机制

Mechanism to shadow a void* pointer with a macro

本文关键字:指针 机制 void      更新时间:2023-10-16

我注意到,通过将复杂对象隐藏为类中的void*指针,并在单独的cpp中处理它们,我可以(显着)加快编译时间。前向声明这些类太难维护了。

使用宏有时有效,但有时不起作用。有人知道用强制转换来遮蔽变量的方法吗这样我就能得到l-value了?有什么我可以做的结构,有一个隐式强制转换运算符,可以给我一个l-value。有没有什么我没看到的典型方法来处理这些问题?

struct K : CGAL::Exact_predicates_inexact_constructions_kernel {};
typedef CGAL::Delaunay_triangulation_2<K> Triangulation;
typedef Triangulation::Vertex_handle Vertex_handle;
#define Triangulation_Ptr (static_cast<Triangulation*>(this->Triangulation_Ptr))
void MyClass::cleanTriangulation()
{
    delete Triangulation_Ptr;//works, this->Triangulation_Ptr is a void*
}
void MyClass::addToTriangulation(int idx, MyPoint l)
{
    if (Triangulation_Ptr == nullptr)
    {
        Triangulation_Ptr = new Triangulation;// No a l-value, doesn't compile
    }
    //something, that adds a point
}

你会得到很多人建议你不要这样做,但我分担你的痛苦。除了编译时间之外,仔细设计和使用类型、模板甚至宏层可以生成业务逻辑更容易理解的代码,即使底层代码不容易理解。您可能会偶尔出现奇怪的编译错误,但在我看来,在精心选择的情况下,这些努力是值得的。

话虽如此,你想要的并不一定容易实现。如果你打算使用宏,你想用一种方式标记它们,让那些使用它们的人知道他们在玩什么。

这样的东西有用吗?

#define Triangulation_Ptr (Triangulation*)(&this->Triangulation_Ptr)

问题的部分原因是这些是指向成员的指针,实际上与普通指针不同。