gpt4 book ai didi

c++ - 当全局函数需要指向 impl 的指针时,如何防止 impl 细节出现在头文件中?

转载 作者:行者123 更新时间:2023-11-28 02:11:46 27 4
gpt4 key购买 nike

我正在使用 pimpl idiom在我的代码中有很多,主要是为了减少编译时间。

我遇到了调用 C 库的情况。我有一个 C++ 包装器类,它有它的接口(interface),血淋淋的细节都在 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 被声明为私有(private)的。我只能想到不完美的解决方案:

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

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

最佳答案

你可以在 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();
}

关于c++ - 当全局函数需要指向 impl 的指针时,如何防止 impl 细节出现在头文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421700/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com