如何在C++20中参数化模块?

9cbw7uwe  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(175)

我指的是这样一种情况:

#define __STDC_FORMAT_MACROS 1
#include <inttypes.h>

这个例子可能很少用到,但它只是一个例子,这种方法被广泛使用,特别是在项目中。为系统或编译器类型和版本定义的宏也采用类似的方法,在编译器命令行中定义的宏也是如此。
我的问题是,当你已经有一个使用普通名称的模块时,是否存在某种机制可供即将使用import声明的开发人员使用,比如:

#define __STDC_FORMAT_MACROS 1
#export __STDC_FORMAT_MACROS
import std.inttypes;

或者,更好的方法是指定导出到模块的参数专门用于该模块(这样就不会传播到其他模块)。有什么机制可以实现这一点吗?

kqlmhetl

kqlmhetl1#

模块80%的意义在于模块是一个“固定”的对象,它的定义完全不受模块本身之外的任何东西的影响。如果你可以“参数化”它们,那会让它们变得毫无价值,因为每次你导入一个模块,你都必须重新编译它。这正是模块存在的问题。
模块唯一接受的参数是编译器的命令行参数,就像任何其他翻译单元一样。

42fyovps

42fyovps2#

如果你是编写模块的人,你可以使用模板和专门化来配置/参数化它。

//=====================================
// 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),然后让一个 separate 模块提供实现,并使用配置参数或其他模板专门化机制来获取该实现。

相关问题