![](/img/trans.png)
[英]How do I access a template class member field in a specialised template class in 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; }
。
這里的問題是該解決方案必須符合以下主要限制:
MyData <>必須滿足標准布局類的要求 。 這意味着所有數據成員應位於一個類中。 將可選數據成員重構為基類是不可能的。
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.