从头文件移动第三方库

Moving third party library from header file

提问人:David Hovsepyan 提问时间:11/12/2023 更新时间:11/12/2023 访问量:43

问:

我有以下代码片段:

#include <nats/nats.h>

class MyClass
{
public:
    // some functions here
private:
template<typename T, void (*DestroyFn)(T*)>
decltype(DestroyFn) makeDeleter()
{
    return [](T* ptr)
    {
        DestroyFn(ptr);
    };
}

std::unique_ptr<natsOptions, std::function<void(natsOptions*)>> m_options{
    nullptr,
    makeDeleter<natsOptions, natsOptions_Destroy>()};
std::unique_ptr<natsConnection, std::function<void(natsConnection*)>> m_connection{
    nullptr,
    makeDeleter<natsConnection, natsConnection_Destroy>()};
std::unique_ptr<natsSubscription, std::function<void(natsSubscription*)>> m_subscription{
    nullptr,
    makeDeleter<natsSubscription, natsSubscription_Destroy>()};
};

如果我不需要自定义删除器,我可以轻松地从 NATS 库转发声明使用的类型。但是,如果我有函数模板删除器从库中调用实际函数(例如,)是否可以做同样的事情? 问题是代码的审阅者要求不要在当前头文件中包含第 3 方库,但另一方面,在我的情况下我没有看到问题,因为当前头文件仅包含在两个文件中,因此如果 .makeDeleternatsOptions_Destroy.cppnats.h

C++11

评论

1赞 Igor Tandetnik 11/12/2023
好吧,您可以省略数据成员初始值设定项,而是在构造函数初始值设定项列表中初始化它们(可能位于源文件中)。
0赞 David Hovsepyan 11/12/2023
会尝试,谢谢@IgorTandetnik。但是,我不能在标头中保留未初始化,对吗?我想可以通过稍后在构造函数中分配删除器来初始化它们。std::unique_ptrnullptr
1赞 Igor Tandetnik 11/12/2023
是的,您可以在标头中保留它们,而不使用初始值设定项,并在构造函数中初始化它们。在类初始化器发明之前(相对较近),多年来一直是这样完成的。
0赞 David Hovsepyan 11/12/2023
将第三方标头移动到.cpp后,现在我的标头中有以下内容:类型def结构nats选项选项;std::unique_ptr<选项, std::function<void(选项*)>> m_options;我稍后在.cpp中的构造函数中初始化了成员。不幸的是,我收到如下错误:错误 C2664 'natsStatus natsConnection_Connect(natsConnection **,natsOptions *)':无法将参数 1 从“bridge::natsConnection **”转换为“natsConnection **”status = natsConnection_Connect(&connection, options);桥接 NatsHandler.cpp 167 同样的错误也适用于其他成员。
1赞 Igor Tandetnik 11/12/2023
您转发了错误的类型。.将 forward 声明放入正确的命名空间中。::natsConnection != bridge::natsConnection

答: 暂无答案