簡體   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