Это модельный случай, когда есть обобщенная c функция func
, а затем (гуманно говоря) более специализированная функция func
для классов, производных от Base
через CRTP, которая включена только для соответствующего типа аргумента через enable_if
.
#include<type_traits>
#include<iostream>
// CRTP hierarchy
template<class T> class Base{ };
class Derived: public Base<Derived>{};
// overload 1
template<class T> void func(const T& a){ std::cerr<<"1\n"; }
// overload 2
template<class T, typename std::enable_if<std::is_base_of<Base<T>,T>::value,int>::type* = nullptr>
inline void func(const Base<T>& obj){ std::cerr<<"2\n"; }
int main(void){ func(Derived()); }
Однако компилятор все еще считает, что первая перегрузка лучше подходит. Я понимаю, что enable_if
только включает функцию, но не делает ее лучше для разрешения перегрузки.
Я сожалею, что не смог разобраться в Шаблон функции раздел справочника по c ++.
Может кто-нибудь дать совет, как заставить компилятор отдавать предпочтение вторая функция?
Спасибо!
Редактировать: МОТИВАЦИЯ: При реальном использовании эти функции должны обрабатывать различные типы скаляров и массивов (в частности, Eigen, который использует CRTP). Скаляры должны охватывать все типы чисел c, такие как целые числа, числа с плавающей запятой, ... (без их перечисления), а другая перегрузка должна охватывать массивы - опять же, не перечисляя их, но зная, что все они получены из Eigen::DenseBase<Derived>
.