長時間以來,我一直在考慮解決我的問題,而當我沒有其他想法時,我終於明白了,只是在此問一問。C++每個派生類的分隔靜態字段
我有以下問題。
簡短版本。如何從基類繼承靜態字段,但在每個派生類中使其唯一,並保留將這些類轉發到父類的可能性?
長版。我需要爲一組類創建一些基本接口。每個類都需要有一個靜態字段和一個靜態方法。但我希望能夠將所有這些類作爲參數傳遞給一個使用這些靜態成員的通用函數。所以我在考慮從一個基類繼承它們。
但我當然不能簡單地繼承靜態成員,並期望它們在每個子類中都是唯一的。我試圖使用好奇的循環模板模式(CRTP),但它迫使我製作這個通用函數模板,並在每次調用時直接給它起類名。這對我不好。
此外,我使用CRTP工作時遇到問題時,使用多個級別的繼承(即當我想從派生從這個模板基類的類派生多一個類)。有什麼方法可以實現我需要的嗎?
我知道類似的問題已經被提出,但大多數作者對CRTP感到滿意。對我來說,它似乎不像解決方案夠好。
//pseudo-code for what I need, doesn't work of course
class Base {
public:
static int x;
static int GetX() {return x;}
}
class Derived : public Base {};
class NextDerived : public Derived {};
class NextDerived2 : public Derived {};
void Foo(Base& a) {a.x = 10;}
int main {
NextDerived d;
NextDerived2 d2;
Foo(d);
Foo(d2); //both Foos modify different static variables
}
//CRTP attempt
template <class C>
class Base {
public:
static int x;
static int GetX() {return x}
};
class Derived : public Base<Derived> {};
int Derived::x = 0;
template <class C>
void Foo(Base<C>& b) {
b.x = 10;
return;
};
int main() {
Derived d;
Foo<Derived>(d);
}
這聽起來像一個模板的工作。 –
CRTP是解決您的問題的方案。我沒有看到任何其他方式爲每個子類使用不同的靜態變量。 CRTP解決方案有什麼問題? –
爲什麼寫'Foo(d);'? 'Foo(d);'應該很好。 –