我正在构建一个小型的c ++共享库,该库具有这样的类(在头文件上)
class Foo {
...
std::optional<some_type> _bar;
...
};
由于std::optional
是C ++ 17,所以包含上述文件的任何人都需要编译C ++ 17。但是,_bar
不是库公共接口的一部分。 _bar
仅在实现中使用。因此,我的问题是,如何公开仅公开公共方法但维护我的实现C ++ 17的头文件?我希望我不必强迫库的用户使用C ++ 17,对吧?
如果重要的话,我也正在使用CMake生成构建文件。
答案 0 :(得分:0)
由于您正在构建共享库:
您可以定义具有所有接口(纯虚拟)的基类BaseFoo
。
然后从Foo
导出BaseFoo
,并添加一个工厂函数:getFoo
然后,将您的Foo
实现为动态库,并导出工厂函数(__attribute__ ((visibility ("default")))
)
现在,将BaseFoo
标头与动态库一起发送(确保客户端使用的libstdc ++版本相同)。