【问题标题】:How to overload/specialize template class function to handle arithmetic types and a container-class如何重载/专门化模板类函数来处理算术类型和容器类
【发布时间】:2018-11-30 15:33:00
【问题描述】:

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

这是我使用模板编程的第一步,所以我期待着如何解决这个问题的技巧和想法

【问题讨论】:

标签: c++ templates overloading eigen specialization


【解决方案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> ) { ...}
};

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

【讨论】:

  • 哇!很好的答案!非常感谢您的帮助!
  • @JonasFertsch 并不是我在乞求支持:),但在 Stack Overflow Upvotes/Answer 接受比“谢谢”cmets 更受欢迎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多