gpt4 book ai didi

c++ - 在 C++ 的子类中强制执行静态方法重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:54 24 4
gpt4 key购买 nike

我有这样的东西:

class Base
{
public:
static int Lolz()
{
return 0;
}
};

class Child : public Base
{
public:
int nothing;
};

template <typename T>
int Produce()
{
return T::Lolz();
}

Produce<Base>();
Produce<Child>();

两者都返回 0,这当然是正确的,但不需要。无论如何在第二个类中强制执行 Lolz() 方法的显式声明,或者在使用 Produce<Child>() 时可能抛出编译时错误?

还是 OO 设计不好,我应该做一些完全不同的事情?

编辑:

我基本上想做的是做这样的事情:

Manager manager;

manager.RegisterProducer(&Woot::Produce, "Woot");
manager.RegisterProducer(&Goop::Produce, "Goop");

Object obj = manager.Produce("Woot");

或者,更一般地说,外部抽象工厂不知道它正在生成的对象的类型,因此无需编写更多代码就可以添加新类型。

最佳答案

有两种方法可以避免它。其实,这取决于你想说什么。

(1) 将Produce()作为基类的接口(interface)。

template <typename T>
int Produce()
{
return T::Lolz();
}
class Base
{
friend int Produce<Base>();

protected:
static int Lolz()
{
return 0;
}
};

class Child : public Base
{
public:
int nothing;
};

int main(void)
{
Produce<Base>(); // Ok.
Produce<Child>(); // error :'Base::Lolz' : cannot access protected member declared in class 'Base'
}

(2) 使用模板特化。

template <typename T>
int Produce()
{
return T::Lolz();
}
class Base
{
public:
static int Lolz()
{
return 0;
}
};

class Child : public Base
{
public:
int nothing;
};

template<>
int Produce<Child>()
{
throw std::bad_exception("oops!");
return 0;
}

int main(void)
{
Produce<Base>(); // Ok.
Produce<Child>(); // it will throw an exception!
}

关于c++ - 在 C++ 的子类中强制执行静态方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/957838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com