我正在尝试扩展一些我无法访问的类的功能。
基本上我正在尝试创建一个toString / toXML方法用于记录目的。我想创建一个单例(本质上是一个映射),我可以注册不同的函数,并以一种方式全局提供它们,所以我可以有类似string Singleton::toString(void* or abstractObject*)
的东西,它会从地图中选择正确的方法,具体取决于类型。
虽然我可以使用typeid获取类型信息,但我希望能够为基类实现它,然后让所有派生类都使用该方法,除非我有一个“更接近”/更合适的方法。
这是可能的,还是应该更改为不同的方法(模板可以这样做)?不幸的是,我无法访问相关课程,因为大多数课程来自第三方图书馆。
答案 0 :(得分:0)
我发现以下是一种非常简单的方法,可以跟踪我定义的基类和派生结构或类的类型。
_kind不一定是一个字符串。事实上,它可能应该是一个枚举。但是,由于我在设计一个相当高级别的程序时,字符串对我来说足够快。
struct base
{
protected:
string _kind;
public:
base()
{
_kind = "base";
}
~base()
{
}
string kind()
{
return _kind;
}
}
struct derived : base
{
derived()
{
_kind = "derived";
}
~derived()
{
}
}
对于内置结构,可能重载toString和toXML方法并让编译器决定?
string toString(structure1 A)
{
...
}
string toString(structure2 A)
{
...
}
这可能会对派生结构造成一些混淆,但我认为编译器会选择叶结构作为类型而不是基类。
例如,如果你有类型A:B:C:D,并且函数f是为C和A定义的。如果你输入一个B类型的变量,那么它应该被自动类型化为A.如果你输入一个类型为C的变量,然后它将使用类型C的函数。如果输入类型为D的变量,则应将其自动类型化为C类型,然后调用C函数。
您也可以尝试基本上做同样事情的模板。
template <class t>
string toString(t A)
{
...
}
干杯, 奈德