【发布时间】:2017-11-23 16:03:08
【问题描述】:
我正在尝试使 一个接口 成为一个抽象类,该类将由派生的孩子实现。该类中的一种方法必须是可变参数(孩子们可以得到一个或多个QSharedPointer<QObject>,具体取决于实现)
问题是:
模板方法不能是虚拟的
由于
error: expansion pattern ‘QSharedPointer<QObject>’ contains no argument packs.,我无法制作采用QSharedPointer<QObject>... args参数的可变参数方法
字少,代码多:
class BaseClass {
public:
virtual void foo(QSharedPointer<QObject>... args) = 0;
}
class ChildClassA : public BaseClass {
public:
void foo(QSharedPointer<QObject> arg1);
}
class ChildClassB : public BaseClass {
public:
void foo(QSharedPointer<QObject> arg1, QSharedPointer<QObject> arg2);
}
我想用上面的类来做这样的事情:
template <class T = BaseClass>
class Controller<T>{
void callFoo(QSharedPointer<QObject>... args){
T* = new T();
T->foo(args);
}
}
如您所见,BaseClass 只是说:使用我的一个孩子作为泛型类型。
如何让这些事情发挥作用?在 C++ 中甚至可能吗?
【问题讨论】:
-
接收一个智能指针向量怎么样?
-
@Quentin 对我来说有点'meh',因为你可以传递空向量。另外,使用
ChildClassA时每次只将一个对象包装到包装器中是没有意义的 -
如果你想优化 known-child 访问,你可以保留 N-parameters 函数但是使用一个向量来覆盖虚拟的。问题是当在静态类型为
BaseClass的对象上调用foo时,C++ 不知道孩子需要多少参数。这也是一种奇怪的设计:你怎么知道参数的数量?如果不匹配应该怎么办?将孩子分开是一个解决方案吗? -
你总是可以求助于
virtual void foo(...) = 0;,但我不知道你是否真的想要。 -
@Quentin 实际上我知道子方法将采用多少个参数,因为通用“控制器”类适用于指定的子类。例如。
template <class T = BaseClass> class GenericClass{}BaseClass 的唯一目的是作为接口,表示必须将 Child 类之一用于该通用插槽。