如何在C++20中参数化模块
How to parametrize modules in C++20?
我指的是这样的情况:
#define __STDC_FORMAT_MACROS 1
#include <inttypes.h>
这个确切的例子可能很少使用,但它只是一个例子,这种方法被广泛使用,尤其是在项目内部。为系统或编译器类型和版本定义的宏采用类似的方式,也是在编译器命令行中定义的宏。
我的问题是,当您已经有一个使用正常名称的模块时,是否存在一些机制可供即将使用import
声明的开发人员使用,比如:
#define __STDC_FORMAT_MACROS 1
#export __STDC_FORMAT_MACROS
import std.inttypes;
或者,也许更好的做法是,指定专门导出到模块的参数(不会扩散到其他模块(。是否有任何机制可以实现这一目标?
模块的整个要点大约80%是模块是一个固定的对象,其定义完全不受模块本身之外的任何东西的影响。如果你能"参数化"它们,那就会让它们变得毫无价值,因为每次导入模块时,你都必须重新编译它。这正是模块存在的问题。
模块所采用的唯一参数是编译器的命令行参数,就像任何其他翻译单元一样。
如果你是编写模块的人,你可以使用模板和专业化来配置/参数化它
//=====================================
// Module
//=====================================
template<typename EnableIf = void>
struct FooConfig {
static constexpr int value = -1;
};
template<typename Config = FooConfig<> >
void foo() {
// Some functionality based on the configuration settings.
std::cout << Config::value << std::endl;
}
//=====================================
// Module configuration
// (lives outside module)
//=====================================
template<>
struct FooConfig<void> {
static constexpr int value = 2;
};
https://godbolt.org/z/df5185cP4
与宏不同;参数化";发生在导入之后。模块本身是固定的——尽管你可以在其中专门化一些东西,包括其他模板函数,以启用你想要的任何自定义行为。
因此,根据另一个答案中的讨论,您可以放入不同加密库的所有实现(假设它们在构建模块的系统上都可用(,并使用配置参数在它们之间进行选择。
或者更实际的做法是,让你的基本库提供一个加密接口(默认为none(,然后让一个单独的模块提供实现,并使用配置参数或其他模板专用化机制来获取该实现。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- INET无线接口表模块参数
- 如何在C++20中参数化模块
- 错误 带有模块的一元"*"(具有"int")的类型参数无效
- 使用"const char*"和"char*"参数连接两个第三方模块
- r-使用Rcpp模块公开带有引用参数的c++类方法时出错
- 获取传递给子模块(C#.NET dll)中的主模块(VC++ exe)的参数
- Native Node.JS模块-解析参数中的int[]
- 如何在c++ OCX模块中指定一个接受void*参数的函数
- omnet++:未知参数.不能在模拟中使用模块参数
- 使用git和CMake的c++:如何构建带有特定参数的子模块
- 在运行时改变参数时通过另一个模块回调(重新建立)一个模块