c++ - 如何制作智能指针的可变函数?

标签 c++ qt

我正在尝试使一个接口(interface) 成为一个抽象类,它将由派生的子类实现。该类中的一种方法必须是可变的( children 得到一个或多个 QSharedPointer<QObject> 取决于实现)

问题在于:

  1. 模板方法不能是虚的

  2. 我无法使用 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,它们是 0N - 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/

相关文章:

python - 无法选择 TreeView 内的复选框

c++ - setContextProperty 和 setProperty of object 的区别

c++ - 用 "set"函数自动替换赋值运算符

c++ - 用于 12 位灰度 JPEG 压缩的霍夫曼表

c++ - 在小部件的多级层次结构中使用 QActions 的推荐方法是什么?

c++ - 触发属性更改的 QML 动画

c++ - C++中的指针类型有什么意义?

c++ - 用于输出的 visual studio code C++ 终端

c++ - 为什么(删除的)复制构造函数优于隐式转换?

c++ - Qt C++ 创建一个所有类都可以访问的全局变量