将模板类作为方法的参数传递

时间:2009-10-14 17:41:15

标签: c++ templates

我有一个带有这样签名的类方法:

// someheader.h
class Blah {
...
  void DoSomeWork(class Screen& p);
..
};

然而,Screen类应该现在变成一个模板,比如......

template <int width, int height>
class Screen {
...

所以我的问题是,如何在someheader.h中更改方法的原型?

3 个答案:

答案 0 :(得分:10)

Screen不是定义的类型,只有Screen<int,int> 由于您希望将模板化类型作为参数,因此需要将其设置为函数模板。有了它,您可以命名参数类型:

class Blah
{
public:
    template<int width, int height>
    void DoSomeWork(Screen<width,height>& p);
};

答案 1 :(得分:5)

由于DoSomeWork在Screen是模板之前就已经存在,它可能不需要知道Screen现在是模板。因此,您可以使用ScreenBase类来定义DoSomeWork所需的API,并且Screen继承自此:

class ScreenBase { ... };

class Blah {
   DoSomeWork(const ScreenBase& s) { ... }
};

template <int width, int height>
class Screen : public ScreenBase
{
   ...
};

答案 2 :(得分:1)

有时最简单的方法是定义模板函数来处理模板化类型的参数。当然,这意味着这些函数的实现需要移动到头文件,这有时可能是一个问题。

另一种方法是定义一个抽象基类并从中派生模板类,然后在函数签名中使用指向抽象接口的指针或引用。

class IScreenBase
{
     virtual void DoSomeWork() = 0;
};


class Blah
{
     DoSomeWork(IScreenBase& s) { s.DoSomeWork(); }
};

template <typename T>
class Screen : public IScreenBase
{
     virtual void DoSomeWork() { ... }
};

Screen<Foo> s;

Blah blah;
blah.DoSomeWork(s);