将模板类作为参数传递给函数

ent*_*edX 11 c++ templates

如果我使用诸如的模板定义类

template<class K, class V>
class myclass {
...
};
Run Code Online (Sandbox Code Playgroud)

有没有办法将myclass定义的对象传递给函数而不使用函数的模板?换句话说,对于每个接受myclass对象的函数,是否还需要使用模板<class K,class V>来定义?

这样做的主要原因是我想定义一组作用于myclass对象的静态函数,这样我就可以在cpp文件中而不是在头文件中限制这些函数的范围.

Dav*_*men 8

使模板类继承自某个基类:

template<class K, class V>
class myclass : mybaseclass { ... };
Run Code Online (Sandbox Code Playgroud)

其中基类将模板的公共功能声明为纯虚拟.这样,你只有一个功能,而不是为每一个功能K,V组合.


Ker*_* SB 5

你不能.类模板不是类 - 它只是一个模板.只有插入模板参数后才能获得类型,并且对于每个不同的参数集,您将获得不同的,不相关的类型.

也许你可以运行某种类型的擦除方案,你有一个容器类,它包含一个抽象的成员指针,并为每种类型实例化一个具体的派生对象.(看看Boost.any.)

有点像这样:

class MyClassHolder { };

template <typename K, typename V>
class MyClassConcrete {  };

class MyClass
{
  MyClassHolder * p;

public:
  template <typename K, typename V> init(...)  // could be a constructor
  {
    p = new MyClassConcrete<K, V>();
  }
};
Run Code Online (Sandbox Code Playgroud)

现在你可以让你的函数接受了MyClass,但你必须添加足够的虚函数MyClassHolder,实现它们MyClassConcrete并公开它们MyClass,你可以实现所有你想要的语义.


Jon*_*Jon 2

不,您还必须对函数进行模板化(当然,除非它们仅限于特定的专业化myclass)。