长时间以来,我一直在考虑解决我的问题,而当我没有其他想法时,我终于明白了,只是在此问一问。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);'应该很好。 –