我想用c++设计一个具有以下要求的数据仪表板框架:
acceptable)
存储/访问对象。
下面的示例代码演示如何使用它
// data.hpp
struct DataA
{
DataA();
int a;
};
struct DataF
{
DataF();
float f;
};
// data.cpp
static DataA s_da;
static DataF s_df;
DataA::DataA()
{
if(!Dashboard::Register("A", s_da)) {
cerr << "unable to register DataA, key is used";
}
}
DataF::DataF()
{
if(!Dashboard::Register("F", s_df)) {
cerr << "unable to register DataF, key is used";
}
}
// main.cpp
int main ()
{
DataA da;
da.a = 123;
Dashboard::Set("A", da);
DataF df;
df.f = 3.14;
Dashboard::Set("F", df);
cout << ((DataA)Dashboard::Get("A")).a << endl; // 123
cout << ((DataF)Dashboard::Get("F")).f << endl; // 3.14
return 0;
}但是,我想不出实现Dashboard类来提供接口的任何想法。
如何使用给定的数据类型和键动态注册对象?是否有满足此需求的设计模式?
发布于 2021-03-12 18:15:09
我构建了类似您在我的团队中描述为一个库内部的东西,这个库用于在应用程序中路由消息。
如果您被困在C++11上(例如std::any或std::variant不可用),则可以有一个空的虚拟基类类型如下:
class BaseValue
{
public:
BaseValue() {};
virtual ~BaseValue() {}; // need one virtual method for dynamic_cast
};以及派生的模板类,例如:
template <typename T>
class Value : public BaseValue
{
public:
Value(const T& t) : _t(t)
{}
T _t;
};那么您的数据结构是这样的。它是字符串到BaseValue指针之间的映射
unordered_map<string, BaseValue*> dashboard;我们将通过使用从BaseValue派生的模板类值将数据走私到上面的映射中。
插入仪表板如下所示:
template <typename T>
void insert(const string& name, const T& t)
{
Value<T>* pT = new Value<T>(t);
dashboard.insert(name, pT);
}抓取就像这样。对于“未找到”的场景,构建"get“调用有不同的方法。
template<typename T>
T& get(const string& name, const T& default = {})
{
auto itor = dashboard.find(name);
if (itor != dashboard.end())
{
BaseValue* pBaseValue = itor->second;
T* pValue = dynamic_cast<T*>(pBaseValue);
if (pValue)
{
return pValue->_t;
}
}
return default; // you could also throw an exception
}示例插入:
DataA da;
da.a = 123;
insert("a", da);示例提取:
DataA& da = get<A>("a");你可以对上面的内容做很多改进。首先,您可以将所有助手函数转换为一个类。在内部使用shared_ptr而不是原始指针。等等。
https://stackoverflow.com/questions/66596763
复制相似问题