![](/img/trans.png)
[英]Why did std::allocator lose member types/functions in C++17?
[英]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.