簡體   English   中英

C++17 — 將成員變量的類型映射到 std::optionals

[英]C++17 — mapping types of member variables to std::optionals

我怎么能采取一些結構:

template<typename T>
typedef struct something_t {
  int x;
  int y;
  T z;
} something_t;

並創建一個實用程序類型(可能與一些宏組合),將其映射到相同形狀的結構,但充滿std::optionals 換句話說,我將如何在以下代碼中編寫partial結構,

template<typename T>
struct partial<T> { using type = ??? };

template<typename T>
using partial_something_t = partial<something_t<T>>::type;

...這將導致partial_something_t具有以下定義:

template<typename T>
typedef struct partial_something_t {
  std::optional<int> x;
  std::optional<int> y;
  std::optional<T> z;
} partial_something_t;

如果你控制something_t的定義,你可以這樣改變它:

template <template<typename> typename Wrapper, typename T>
struct new_something_t {
  Wrapper<int> x;
  Wrapper<int> y;
  Wrapper<T> z;
};

然后定義一個別名:

template <typename What> 
using Id = What;

現在你原來的something_t<T>變成new_something_t<Id, T>partial_something_t<T>new_something_t<std::optional, T>

實現此目的的一種方法是將本地包含與宏重載一起使用。 以這種方式創建一個包含內部結構的 new.inl.h 文件:

BEGIN_TEMPLATE_STRUCT(something_t)
  DECLARE_MEMBER(int, x)
  DECLARE_MEMBER(int, y)
  DECLARE_MEMBER(T, z)
END_TEMPLATE_STRUCT

然后使用 push 和 pop_macro 創建兩個不同的 header 文件(或僅一個您喜歡的文件),它們自己定義具體的宏定義。 將 push_macros 放在 this.inl.h 文件的包含結構的原始聲明之前,包含該文件,然后不要忘記 pop_macro 之后有一個干凈的 state。 Header 然后定義 BEGIN_TEMPLATE_STRUCT 作為 something_t 和 header 兩個作為 partial_something_t 和根據您想要的最終類型的子宏(DECLARE_MEMBER 為 std::optional...)。 這種方法的好處是,您擁有數據的最小基本表示,可以適應更復雜的數據。 主要缺點是(容易出錯的)宏使用本身以及一些工作來編寫至少更復雜的成員,如方法類型。

暫無
暫無

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

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