用宏来遮蔽void *指针的机制

时间:2014-07-23 22:48:16

标签: c++

我注意到我可以通过将复杂的对象隐藏在我的类中的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
}

1 个答案:

答案 0 :(得分:1)

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

话虽如此,你所尝试的并不一定容易实现。如果您要使用宏,您希望以一种方式标记它们,使用它们的人知道他们正在玩什么。

这样的事情有用吗?

#define Triangulation_Ptr (Triangulation * )(&amp; this-&gt; Triangulation_Ptr)

部分问题是这些是指向成员的指针,它们与普通指针实际上并不相同。