繁体   English   中英

如何重载/专业化模板类函数以处理算术类型和容器类

[英]How to overload/specialize template class function to handle arithmetic types and a container-class

我正在尝试创建一个具有成员函数的模板类,该成员函数可以处理算术数据类型(int,char,float ...)和一个容器类,例如Eigen :: DenseBase <>或std :: vector <>

代码来展示我的想法:

template <typename T>class myClass{
  ...
  void foo(T);
  ...
};

template <typename T> void myClass<T>::foo(T){
  //Function for arithmetic Datatypes
}
//Specialization does not work - What is the correct (best?) approach?
template <> void myClass<T>::foo(<Eigen::DenseBase<T>){
  //Function for Eigen::DenseBase<T> - Objects
}

这是我进行模板编程的第一步,因此我期待着解决该问题的技巧和想法。

您尝试做的事情称为部分专业化。 您正在尝试使自己的foo 专用于一系列类型,即Eigen::DenseBase实例类型。 不幸的是,这是不可能的。

模板类的成员函数只能完全专业化,即可以为特定类型提供实现。 例如,这将起作用:

    template <>
    void myClass<char*>::foo(char* );

对foo进行部分专业化的唯一方法是将其对整个类进行部分专业化。 像这样:

template <typename T>
class myClass{
  ...
  void foo(T);
  ...
};

template<class T> 
class myClass<Eigen::DenseBase<T>> {
    void foo(Eigen::DenseBase<T> ) { ...}
};

需要注意的是,如果您(部分)专门研究该类,则需要提供原始模板中通常需要存在的所有成员(通常有很多复制副本)。 这里的标准解决方案是将不依赖于部分专业化的所有内容放到基类中,并从中继承您的模板和专业化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM