簡體   English   中英

如何在 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% 的整個模塊點是模塊是固定的 object,其定義完全不受模塊本身之外的任何影響。 如果您可以“參數化”它們,那會使它們變得毫無價值,因為每次導入模塊時,都必須重新編譯它。 這正是存在要防止的問題模塊。

模塊采用的唯一參數是編譯器的命令行 arguments,就像任何其他翻譯單元一樣。

如果您是模塊的編寫者,則可以使用模板和專業化來配置/參數化它。 考慮以下:

//=====================================
// 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

與宏不同,“參數化”發生導入之后。 模塊本身是固定的——盡管你可以在其中專門化一些東西,包括其他模板函數來啟用你想要的任何自定義行為。

因此,按照其他答案之一的討論,您可以放入不同加密庫的所有實現(假設它們在構建模塊的系統上都可用)並在它們之間使用 select 的配置參數。

或者更實際地,您可以讓您的基礎庫提供一個加密接口(默認為無),然后讓一個單獨的模塊提供實現,並使用配置參數或其他模板專門化機制來獲取該實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM