【发布时间】:2020-04-27 09:49:03
【问题描述】:
我正在开发一个在 ESP32 微控制器 (c++11) 上执行的项目,我想实现一个可以将类引用(不是这些类的实例)作为参数的类方法,以便执行静态这些类的方法。
我设法实施以下工作解决方案:
#include <iostream>
class Model
{
public:
static void foo()
{
std::cout << "Model.foo invoked" << std::endl;
};
};
class ModelA: public Model
{
public:
static void foo()
{
std::cout << "ModelA.foo invoked" << std::endl;
};
};
class ModelB: public Model
{
public:
static void foo()
{
std::cout << "ModelB.foo invoked" << std::endl;
};
};
class Manager
{
public:
template <class T = Model>
void callFoo()
{
T::foo();
}
template<class T = Model, class ... args>
void setup()
{
callFoo<T>();
callFoo<args...>();
}
};
int main()
{
Manager manager;
manager.setup<ModelA, ModelB>();
return 0;
}
输出符合预期结果:
ModelA.foo 调用
ModelB.foo 调用
但我觉得这种方法充其量只是一个糟糕的黑客......
是否有人有更好的方法来实现这一点(最好不使用模板)?
提前谢谢你。
文森特。
【问题讨论】:
-
我觉得这个设计有问题。您正在使用
Model衍生物进行名称隐藏,并且整个类型层次结构在示例中没有多大意义。你到底想在这里做什么? -
嗨蒂莫,谢谢你的回答。你是对的,这种设计毫无疑问是有问题的 ;-) 在我的示例中它并不明确,但是从 Model 类继承的所有 Model 类都是单例的。我想在 Manager 类上实现一个 setup 方法,它可以采用任意数量的 Model 子类“类引用”(不是实例),并为每个引用调用 Model 的静态方法。
-
我认为你所拥有的是你在 C++11 中能做到的最好的。使用 C++17,这有效:
template<typename... Models> void setup() { (Models::foo(), ...); } -
目前还不清楚
Model类在这一切中的作用。当ModelA和ModelB不派生自Model以及Model根本不存在时,该代码也可以正常工作。 -
您好,Igor,感谢您抽出宝贵时间回答。我被c++11(微控制器环境)困在这里。实际项目中的模型类是模板单例。
标签: c++ c++11 static-methods