我在我的代码中大量使用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
被宣布为私有。我只能想到不完美的解决方案:
class impl;
在头文件中公开。这并不理想,因为它确实应该是private
——它恰好是一个非类函数需要看到的实现细节。- 放入
from_c_func
头文件,friend
就可以了。这并不理想,因为它的实现细节some_class
正在泄漏。更改实现可能需要更改头文件,然后重新编译很多不需要重新编译的东西,这会让我不高兴。 - 给自己
from_c_func
一个指针some_class
,然后调用一个函数some_class
。这需要将该函数放在头文件中,这又是一个实现细节 -public
无论如何非朋友函数都必须调用它。
该怎么办?到目前为止,我最好的选择似乎是#1,但有没有更好的方法?