2601C++,模块导出分类

模块的导出分类

在导出模块中,有很多种情况,主要包括:

块导出

这好理解,就是几个导出接口用一个导出块导出,如下:

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 ;
相关推荐
仰泳的熊猫3 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
用户69371750013844 小时前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
蓝帆傲亦4 小时前
Web 前端搜索文字高亮实现方法汇总
前端
用户69371750013844 小时前
Room 3.0:这次不是升级,是重来
android·前端·google
漫随流水6 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
Thera7776 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
踩着两条虫7 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
君义_noip8 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
jzlhll1238 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin
旖-旎8 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针