簡體   English   中英

C ++:如何從標准布局類模板中優化出空數據成員?

[英]C++: How do I optimize out an empty data member from a standard layout class template?

我是否可以使用可選的非靜態數據成員的類模板的標准布局實例? “可選”意味着所討論的數據成員不得出現在模板類的某些實例中。

那是,給定:

template <typename T>
struct Dependent
{
    T      m_defaultValue;
};

template <>
struct Dependent<double>
{
};

template <typename T>
struct MyData
{
    T*              m_data;
    Dependent<T>    m_optional;

    T LotsOfAccessorMethods() const;
};

我希望MyData<int>的布局等同於struct { int* x; int y; } struct { int* x; int y; } struct { int* x; int y; }

我希望MyData<double>的布局等同於struct { double* x; } struct { double* x; }

這里的問題是該解決方案必須符合以下主要限制:

  1. MyData <>必須滿足標准布局類的要求 這意味着所有數據成員應位於一個類中。 將可選數據成員重構為基類是不可能的。

  2. MyData <>必須不是專業的 ,甚至不是部分的。 在實際任務中它有相當多的方法和領域,並且在所有專業化中重復它們會破壞擁有通用模板的全部意義。


背景:

我希望將很多特殊容器結構傳達給DLL / SO,這是我無法控制的。 后者意味着我應該假設DLL可能是用其他語言編寫的,或者可能只是用另一個編譯器構建的。 這看起來像標准布局結構的工作。

這些容器結構具有非常相似的數據成員和成員函數集,因此將它們全部合並到類模板將是一種恥辱(以及維護噩夢)。

但是, 其中一些容器必須具有額外的數據成員(標記ID,特殊值等)。 因此問題。

這個怎么樣:

#include <type_traits>
template <typename T>
struct MyData {
    struct general_impl { T* m_data; T optional; };
    struct double_impl  { T* m_data; };

    using data_type = typename std::conditional<
        std::is_same<T, double>::value,
        double_impl,
        general_impl>::type;

    data_type data;

    T LotsOfAccessorMethods() const;
};

暫無
暫無

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

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