使模板类的用户独立于模板类型

时间:2015-08-13 14:57:54

标签: c++ templates

我是C ++的新手。刚刚学习..说,我有两个类 - FrameCapture和ObjectTracker。 ObjectTracker使用FrameCapture作为实例变量。

以下是课程:

template<typename T>
class FrameCapture {
public:
    FrameCapture(T *configOption) : configOption(configOption) {}

    virtual bool nextFrame() const = 0;
private:
    T *configOption;
};

template<typename T>
class ObjectTracker {
public:
    ObjectTracker(FrameCapture<T> *capture) : capture(capture) {}

    virtual void track() const = 0;

private:
    FrameCapture<T> *capture;
};

FrameCapture有一个模板化的配置选项。问题是我希望ObjectTracker不知道FrameCapture的模板详细信息。我想将FrameCapture的不同实例提供给ObjectTracker的实例,而ObjectTracker的实例不会因FrameCapture的实施而受到影响细节。我怎样才能做到这一点?

重批评论家接受了!

谢谢。

3 个答案:

答案 0 :(得分:4)

由于你已经在使用继承,你可以这样做:

class FrameCaptureBase {
public:
    virtual ~FrameCaptureBase() { }
    virtual bool nextFrame() const = 0;
};

template<typename T>
class FrameCapture : public FrameCaptureBase {
public:
    FrameCapture(T *configOption) : configOption(configOption) {}

private:
    T *configOption;
};

class ObjectTracker {
public:
    ObjectTracker(FrameCaptureBase *capture) : capture(capture) {}

    virtual void track() const = 0;

private:
    FrameCaptureBase *capture;
};

答案 1 :(得分:2)

您正在寻找的是类型擦除

首先在未模板化的抽象基类中定义FrameCapture的接口。

class FrameCapture
{
public:

  virtual ~FrameCapture() noexcept = default;
  virtual bool nextFrame() const = 0;
};

模板化版本然后从该界面派生

template <typename T>
class FrameCaptureImpl : public FrameCapture
{
public:

  FrameCaptureImpl(T *);
  virtual bool nextFrame() const override = 0;

private:

  T * config_;  // Are you sure you want to use a raw pointer here?
};

ObjectTracker仅使用非模板化界面。

class ObjectTracker
{
public:

  ObjectTracker(FrameCapture *);
  void track() const;

private:

  FrameCapture * capture_;  // Again, are you sure?
};

答案 2 :(得分:1)

从FrameCapture中删除构造函数和configOption。从FrameCapture派生ConfigurableFrameCapture类并将其全部添加回来。 ConfigurableFrameCapture是一个模板,FrameCapture不是。