struct Test1 : public Base {
enum { type = 1 };
int a;
char ch;
virtual void func1();
};
struct Test2 : public Base {
enum { type = 2 };
int a;
char ch;
virtual void func1();
};
我正在用 C 14 開發一個專案。出于某種兼容性原因,我必須像上面那樣宣告兩個類,它們的成員完全相同。
我的問題是是否有一些元編程方法,它允許我檢查兩個類是否具有完全相同的成員?
真正的問題
是的,我知道這很奇怪,但我確實遇到了這樣的問題......
我正在開發一個網路服務器,上面的每個類都是一個協議。
現在的問題是一些Android開發者錯誤地使用了該協議Test1,所以我們不能觸摸它,因為用戶可能不會更新他們的應用程式。我能做的就是添加另一個協議。所以我添加了類Test2。
由于這兩個協議做的事情完全相同,我想確保它們總是相同的。這意味著如果有人將成員添加到Test1某天但他忘記將成員添加到Test2,我想得到一個編譯時錯誤。
順便說一句,我只關心資料成員,而不關心成員函式。
uj5u.com熱心網友回復:
我不喜歡這個問題的前提,因為它本質上是要求一種方法來保持代碼重復。然而在實踐中會發生一些事情,如果有人想要兩個具有相同內容的類,最好不要宣告兩個類然后檢查它們的兼容性,而是只宣告一次。這可以通過使用基類或使用前處理器來完成。后一種情況還可以防止任何新成員潛入派生類,同時將新成員添加到兩個類中,只需要一次修改:
#define MAKE_CLASS(mp_name) \
struct mp_name : public Base { \
enum { type = 1 }; \
int a; \
char ch; \
void func1(); \
};
MAKE_CLASS(test1)
MAKE_CLASS(test2)
uj5u.com熱心網友回復:
是否可以檢查兩個類是否具有相同的成員
如果您可以升級到 C 20,并且如果類是標準布局,并且您不關心型別的精確匹配,而是關心布局兼容性 - 這樣一個類可能有一個 const 成員,而另一個有非const - 然后你可以使用std::is_layout_compatible型別特征。
否則,您可能不得不求助于元編程。
我想確保它們始終相同。
關于 XY 問題,如果您可以Test1以 API 兼容的方式進行更改,那么繼承可能是一個解決方案:
struct TestData : Base {
int a;
char ch;
};
template<int type>
struct TestBase : TestData {
enum { type = type };
};
struct Test1 : TestBase<1> {
void func1();
};
struct Test2 : TestBase<2> {
void func1();
};
如果您根本無法觸摸Test1,那么一個 hacky 解決方法是將其用作基礎:
struct Test2 : Test1 {
enum { type = 2 };
void func1();
};
由于隱式轉換,這并不理想。你可以通過使用私有繼承來避免這些,但是你會遇到共享 public non-virtual 的問題Base。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/445354.html
上一篇:將llvm-11與使用-std=c 2a編譯的gcc-11中的標準庫頭結合使用時出錯
下一篇:為什么優化器不優化這段代碼?
