gpt4 book ai didi

c++ - 隐藏从外部库定义到我的代码

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:06 25 4
gpt4 key购买 nike

对于我当前的 C++ 项目,我使用来自第三方的外部库(1 个大 header )。此 header 提供多个类似 C 的函数来驱动硬件。为了使其更易于在 C++ 中使用,我编写了一个 C++ 类来包装这些函数并使用 pimpl 实现隐藏此 header 。这些函数的一些参数由其主 header 中的预处理器指令 #define 定义。我想在我的包装器类之外使用这些参数的值,但不包含此 header 。

我试图在我的 C++ 类中使用前向声明的枚举。但是我的枚举成员在定义它们的源文件之外不可用

外部库.h

#define PARAM_A_VAL_0 0
#define PARAM_A_VAL_1 1
bool external_function_param_a(int param_a);

包装器.h

class wrapper
{
enum PARAM_A : int;
...
bool SetParamA(wrapper::PARAM_A a);
}

包装器.cpp

#include <wrapper.h>
#include <external_lib.h>
enum wrapper::PARAM_A: int
{
VAL_0 = PARAM_A_VAL_0,
VAL_1 = PARAM_A_VAL_1
};
bool wrapper SetParamA(wrapper::PARAM_A a)
{
return external_function_param_a(a);
}

main.cpp

#include <wrapper.h>
int main()
{
wrapper w;
w.SetParamA(wrapper::PARAM_A::VAL_0);
// compilation error : VAL_0 not a member of wrapper::PARAM_A
}

我的解决方案有问题还是这个想法根本不可能?有没有更好的解决办法。为类包装器创建很多成员似乎不是一个好主意,也不是在所有函数成员中打开枚举。

最佳答案

如果您必须保持编译时常量性,您将无法避免包含外部 header ,如 this Q&A 中所述。 .

如果不需要编译时常量,您可以将 wrapper::PARAM_A::VAL_NNN 常量的声明和定义分开,如下所示:

标题:

struct wrapper {
class PARAM_A {
int val;
PARAM_A(int val) : val(val) {}
friend class ::wrapper;
public:
static const PARAM_A VAL_0;
static const PARAM_A VAL_1;
};
bool SetParamA(wrapper::PARAM_A a);
};

实现:

const wrapper::PARAM_A wrapper::PARAM_A::VAL_0 = wrapper::PARAM_A(PARAM_A_VAL_0);
const wrapper::PARAM_A wrapper::PARAM_A::VAL_1 = wrapper::PARAM_A(PARAM_A_VAL_1);

bool wrapper::SetParamA(wrapper::PARAM_A a)
{
return external_function_param_a(a.val);
}

现在 API 的使用与示例中的相同:

wrapper w;
w.SetParamA(wrapper::PARAM_A::VAL_0);
w.SetParamA(wrapper::PARAM_A::VAL_1);

Demo.

注意类PARAM_A隐藏int值的方式:因为它不再是enum,所以直接用代替>int 不再可能,因此调用 external_function_param_a 需要“展开”该值。

关于c++ - 隐藏从外部库定义到我的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54025681/

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