在cpp中存储模板化类的非模板部分

时间:2019-04-08 18:11:12

标签: c++

我一直在想这个问题,stackoverflow有很多相关但不完全相同的问题,所以我在这里问。

模板化类是否有可能在cpp中具有不依赖于此模板的方法?显然,这些方法不受模板的影响,因此编译器应该能够分别编译它们。

如果不可能的话,如果真的真的要分离此代码,那将是一种解决方法?

template<typename T>
class MyAwesomeVectorClone{
  size_t size;
  size_t capacity;
  T* data;

  bool doesSizeExceedCapacity(); // non template method, define in cpp?
  void add(T& t){// template method
  }
}
bool MyAwesomeVectorClone::doesSizeExceedCapacity() {
  return size > capacity;
}

2 个答案:

答案 0 :(得分:4)

  

模板化类是否有可能在cpp中具有不依赖于此模板的方法?

不。类模板不是特定的类型,您创建的类型仅在实例化模板时这些成员函数才能属于。因此,不可能将与模板类型参数无关的成员函数与类模板的其余部分区别对待。

但是,您可以做的是将与参数无关的部分提取到单独的类或单独的自由函数中。这是Scott Meyers撰写的Effective C ++中第44项的主题(“模板中与因子无关的代码”)。他提供了一个矩阵示例,其中与参数无关的代码被移入基类,实际的类模板从基类中秘密继承。但是构图当然也不错。

答案 1 :(得分:0)

另一种解决方案是将函数以及任何其他帮助函数添加到一个明确表示其包含对实现类模板有用的函数的命名空间中。

namespace MyAwesomeVectorClone_Impl_Details
{
   bool doesSizeExceedCapacity();
}

这些功能可以在.cpp文件中定义。