我正在尝试使一个接口(interface) 成为一个抽象类,它将由派生的子类实现。该类中的一种方法必须是可变的( children 得到一个或多个 QSharedPointer<QObject>
取决于实现)
问题在于:
模板方法不能是虚的
我无法使用
QSharedPointer<QObject>... args
制作可变参数方法因为error: expansion pattern ‘QSharedPointer<QObject>’ contains no argument packs.
的争论
更少的文字,更多的代码:
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 只是说:使用我的一个 child 作为泛型类型。
如何让这些东西发挥作用?在 C++ 中甚至可能吗?
最佳答案
因为(根据评论)您已经通过元数将子项分开,并且它们由 Controller
的单独实例化管理。类模板,没有必要试图将它们都强制到同一层次结构中——这仅意味着解决方法和运行时开销。
相反,让我们制作BaseClass
一个模板,并使用它的参数生成foo
的签名。
namespace detail {
template <std::size_t, class T>
using expandHook = T;
}
template <std::size_t N, class = std::make_index_sequence<N>>
struct BaseClass;
template <std::size_t N, std::size_t... Idx>
struct BaseClass<N, std::index_sequence<Idx...>> {
virtual void foo(detail::expandHook<Idx, QSharedPointer<QObject>>... args) = 0;
};
detail::expandHook
是一种重复 QSharedPointer<QObject>
的句法技巧有多少次就输入多少次Idx
es,它们是 0
至 N - 1
感谢 std::index_sequence
的工作.
然后,children继承对应的BaseClass
:
struct Child : BaseClass<2> {
void foo(QSharedPointer<QObject>, QSharedPointer<QObject>) override;
};
奖励:一个 child 可以继承多个 BaseClass
如果您希望它支持多个领域,请进行特化!
最后, Controller 将被适当的参数化 BaseClass
类型,一切都会点击。
See it live on Coliru (对于 stub 类型,main
的内容将是 Controller
中的内容)。
关于c++ - 如何制作智能指针的可变函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47459477/