我有多个派生类,这些派生类扩展了同一基类。它们具有相同的属性,但单个方法可能具有不同的参数和主体。我如何拥有std :: unique_ptr并为派生类调用方法?
这是我到目前为止所知道的:
virtual
; 这是我目前倾向于的方向(没有成功):
基类:
class IBase
{
/** ... **/
template <class T, typename ...Args>
MyCustomType perform(T &obj, Args ... args)
{
std::bind(obj->run, args);
}
virtual MyCustomType run(...) = 0;
};
派生类:
class Derived : IBase
{
/** ... **/
virtual MyCustomType run(MyType1 a, MyType2 b, bool c) override
{
/* code */
}
};
我想使用指向基类的指针,调用basePtr->perform(a, b, c)
和子类Derived
中的方法来执行。有道理吗?
答案 0 :(得分:0)
除了可能具有不同参数和正文的单个方法之外
这不是C ++允许您直接执行的操作。 C ++是一种静态类型的语言。函数的调用者和被调用者必须在传递的内容和返回的内容上静态达成一致。期间。
您要做的唯一选择是采用静态类型擦除,例如std::any
或类似技术(例如将数据隐藏在void*
后面,但这非常危险)。也就是说,您可以通过tuple
中存储的值的any
将“参数”传递给函数。而且返回值也可以是any
。
但是,发送代码必须确切地知道接收代码所期望的内容,反之亦然;您不能在不确切知道您期望在那里的情况下打开any
的包装。因此,该接口是通用的,但是接收方和发送方仍然必须就到底发生了什么达成共识。
您绝对不希望接收函数一遍又一遍地尝试一堆不同的转换,以弄清提供了哪些参数集以及因此要调用的函数体。
从广义上讲,由于错误和错误的可能性很高,因此应尽可能避免使用此类接口。
答案 1 :(得分:-3)
我认为我可以使用Variadic Function Templates来解决最初的想法。
class IBase
{
template <typename ... Args>
MyType run(Args... as)
{
MyType result;
return result;
}
};
然后我可以在Derived
中重载此方法:
class Derived : IBase
{
/** ... **/
MyType run(const MyOtherType &X, const int &a);
};
有人能想到此解决方案有问题吗?