Полтора дня бился головой о стену, пытаясь изучить специализацию шаблонов и std :: enable_if (). Я не что-то получаю . Я пытаюсь разрешить указание типа возвращаемого значения из метода класса на основе типа класса И пользовательской спецификации во время компиляции. Например, если тип класса целочисленный, мне может потребоваться возвращаемый тип float (или int) из метода.
Мой фактический вариант использования - это массив, для которого я усредняю все значения внутри. Я мог бы даже захотеть, чтобы возвращаемое логическое значение отражало результат двоичного «голосования». Есть множество комбинаций. Должен быть способ сделать это, не создавая все перегрузки по отдельности. Мой пример кода - самый простой из возможных.
Буду благодарен за любые указатели. Как я могу сделать эту частичную специализацию, если она действительно так называется?
#include <string>
template <class T>
class Test {
public:
Test(T val) { val_ = val; }
template <typename U> U halve ();
private:
T val_;
};
template<class T> template<typename U>
U Test<T>::halve() {
throw std::invalid_argument("Cannot halve non-numeric objects");
}
template<class T> template<typename U> //example: T=int, U=float
typename std::enable_if_t<std::is_arithmetic<T>::value && std::is_arithmetic<U>::value, U>
Test<T>::halve() { //error C2244 - unable to match function definition to an existing declaration
return ((U)val_ / (U)2);
}
int main() {
Test<int> t1(5);
float f = t1.halve<float>(); //expect 2.5
int i = t1.halve<int>(); //expect 2
Test<std::string> t2((std::string)"blah");
int t2h = t2.halve<int>(); //this will throw (by design)
return 0;
}