Как перегрузить / специализировать функцию класса шаблона для обработки арифметических типов и класса контейнера - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать шаблонный класс с функцией-членом, которая может обрабатывать арифметические типы данных (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 голосов
/ 30 ноября 2018

То, что вы пытаетесь сделать, называется частичной специализацией.Вы пытаетесь специализировать ваш 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> ) { ...}
};

Предостережение заключается в том, что если вы (частично) специализируете класс, вам нужно предоставить всех членов, которые должны быть там, из исходного шаблона (часто много копий).дублирование).Стандартное решение здесь - поместить в базовый класс все, что не зависит от частичной специализации, и унаследовать от него ваш шаблон и специализацию.

...