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

时间:2018-11-30 15:33:00

标签: c++ templates overloading eigen specialization

我正在尝试创建一个具有成员函数的模板类,该成员函数可以处理算术数据类型(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
}

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

1 个答案:

答案 0 :(得分:1)

您尝试做的事情叫做部分专业化。您正在尝试专门化您的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> ) { ...}
};

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