模块的导出分类
在导出模块中,有很多种情况,主要包括:
块导出
这好理解,就是几个导出接口用一个导出块导出,如下:
cpp
export module demo;
export {
//导出`多个接口`
void test();
class Example;
constexpr std::string MODULE_NAME = "DEMO";
namespace my_math {
void add(int,int);
}
}
指定导出
指定导出也简单,即使用导出导出指定的接口,如下:
cpp
export module demo;
//导入但不导出
import myself_used;
//`重导出`,`聚集接口`
export import demo_math;
//部分导出:`名字空间`内函数
namespace demo_test {
export void print(char*);
void internal_parse();
//不导出
}
//部分导出:类成员
export class DemoView {
public:
void displayView(int);
//导出
void getData(int);
//导出
private:
void exit();
//不导出
};
分块导出
分块导出如前,看下示例:
cpp
//`demo.cppm`
export module demo;
export import:mytest;
//子分块:`cpp`
export module demo:mytest;
export import :mytest:math;
//`管理内存`
export import :mytest:transfer;
//线程管理
注意:分块时要保证不产生循环依赖
模板导出
导出模板.看代码:
cpp
export module templates;
export template<typename T>
T compare(T a, T b) {
return (a > b) ? a : b;
}
export template<typename T>
class Demo {
public:
void Add(const T& t);
private:
int d_ = 0;
};
export template<>
class Demo<int>
{/*如上,省略*/};
//注意:必须在`cpp`文件中显式`实例化`
export template class Demo<int>;
友元导出
如下:
cpp
export module friend_demo;
export class friendDemo {
private:
int d_ = 0;
private:
friend int getData(const friendDemo&);
public:
void test();
};
友元类类似.
继承导出
继承导出其实和继承关系不大,只是要注意虚函数的导出情况:
cpp
export module inheritance;
//导出基类
export class Base {
protected:
int d_ = 0;
public:
virtual void getData();
};
//导出`继承类`
export class Derived : public Base {
public:
void getBaseData() {
d_ = 100;
}
};
//`用模块继承`
import inheritance;
int main() {
Derived d;
d.getData();
d.getBaseData();
return 0;
}
枚举导出
和类导出一致,更简单.
又和using导出
比较简单,如下:
cpp
export module mytype;
import std;
export using VEC = std::vector<std::string>;
export typedef short int16;
export template<typename T>
using OPT = std::optional<std::reference_wrapper<T>>;
重命名导出
重命名导出也叫别名,其实也很简单,只要注意在模块中的应用方式即可,即不能直接重命名,但可封装后再次导出,如下:
cpp
export module myself;
//导入改名模块
import old_name_lib;
//封装`新功能`名
export void export_new_func_name() {
old_name_lib::old_func_name();
}
//使用`using,typedef`
export using ABC = old_name_lib::Demo ;