0

我在我的代码中大量使用pimpl 习惯用法,主要是为了减少编译时间。

我有一种情况,我正在调用 C 库。我有一个 C++ 包装类,它有它的接口,而且血淋淋的细节都在impl,当然:

class some_class {
public:
    void some_init();
    ...
private:
    class impl;
    std::unique_ptr<impl> m_pimpl;
}

在 cpp 文件中,我必须向 C 库注册一个回调,并在其中给它一个指针。我想将此函数调用转发给相应的成员函数。客户端(即这个函数的用户)根本不需要知道这个细节:

static void from_c_func(void *ptr_to_class_impl) {
    static_cast<some_class::impl *>(ptr_to_class_impl)->from_c_func();
}

void some_class::some_init() {
    create_c_thing(static_cast<void *>(this->m_pimpl.get()), from_c_func);
}

问题是它some_class::impl被宣布为私有。我只能想到不完美的解决方案:

  1. class impl;在头文件中公开。这并不理想,因为它确实应该是private——它恰好是一个非类函数需要看到的实现细节。
  2. 放入from_c_func头文件,friend就可以了。这并不理想,因为它的实现细节some_class正在泄漏。更改实现可能需要更改头文件,然后重新编译很多不需要重新编译的东西,这会让我不高兴。
  3. 给自己from_c_func一个指针some_class,然后调用一个函数some_class。这需要将该函数放在头文件中,这又是一个实现细节 -public无论如何非朋友函数都必须调用它。

该怎么办?到目前为止,我最好的选择似乎是#1,但有没有更好的方法?

4

1 回答 1

2

您可以将您的功能移入impl

static void some_class::impl::from_c_func(void *ptr_to_class_impl) {
    static_cast<some_class::impl *>(ptr_to_class_impl)->from_c_func();
}
于 2016-02-16T00:47:18.833 回答