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

Passing a template class as an argument to a function

本文关键字:参数传递 函数      更新时间:2023-10-16

如果我使用模板定义一个类,例如

template<class K, class V>
class myclass {
...
};

是否有一种方法来传递由myclass定义的对象到函数,而不使用函数的模板?换句话说,对于每个接受myclass对象的函数,是否也需要使用template<K类,V类> ?

这样做的主要原因是我想定义一组作用于myclass对象的静态函数,以便我可以将这些函数的作用域限制在它们的cpp文件中,而不是在头文件中。

让你的模板类继承一些基类:

template<class K, class V>
class myclass : mybaseclass { ... };

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

不行。类模板不是类——它只是一个模板。只有当您插入模板参数时,您才能获得类型,并且对于每个不同的参数集,您将获得不同的无关的类型。

也许运行某种类型擦除方案是可行的,在这种方案中,您有一个包含抽象成员指针的容器类,并为每个类型实例化一个具体的派生对象。(查看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>();
  }
};

现在你可以让你的函数接受一个MyClass,但是你必须添加足够的虚函数到MyClassHolder,在MyClassConcrete中实现它们,并在MyClass中暴露它们,你可以实现所有你想要的语义。

是的,如果你希望你的函数能够接受模板类的任何实例化,它们也必须是模板(通常使用与类相同的模板参数)。

另一方面,你可以让你的模板类继承自一个非模板类,但仍然允许你通过虚函数操作派生类。此外,为了隐藏类的类型并避免在所有代码中发现template,可以使用几种类型擦除技术。

不,您将不得不使函数模板化(当然,除非它们将仅限于使用myclass的特定专门化)。

你可以这样做:

void myfunc(const myclass<int, int>& mc) {}

只有当你想在你的函数中传递任何类型给你的myclass参数时,你才需要让myfunc也成为一个模板。

由于c++的静态特性,您必须为源代码中的每个(K, V)对实例化一个函数副本,因为编译器将不得不生成代码以不同的方式访问每个对的成员。

虽然你的理由对我来说并不完全清楚,是的,每个以myclass为参数的函数也必须在K和V上进行模板化。如果你设法抽象基础,你可以让每个myclass< K, V >(这是K和V的每个组合的不同类型)从实现功能的单个基类继承,或者通过虚函数转发它。