Как написать метод типовой черты

Я определил шаблонный класс (DataArray<T>) и хочу определить функцию min() для вычисления минимального значения массива целочисленного типа (double, float, int,...) или массива сложного типа (std::complex<double>, std::complex<float>,...).

Я пытаюсь использовать признаки типа, чтобы выбрать правильную функцию. Несмотря на отличное обсуждение здесь , мой код не компилируется:

DataArray<double> and DataArray<std::complex<double>>: no matching overloaded function

В чем проблема? Вот минимальная часть моего кода:

#include <iostream>
#include <vector>
#include <complex>
#include <type_traits>

template <typename T>
class DataArray {
public:
    DataArray(T * data) : m_data(data) {}

    template<typename T>
    using isComplex = std::is_same<T, std::complex<typename T::value_type>>;

    template <typename T>
    typename std::enable_if<isComplex<T>::value>::type min() {
        std::cout << "Min for complex" << std::endl;
    }

    template <typename T>
    typename std::enable_if<std::is_arithmetic<T>::value>::type min() {
        std::cout << "Min for arithmetic values." << std::endl;
    }

private:
    T * m_data;
};



int main()
{
    double v1[2] ={ 1., 2.};
    DataArray<double> d1(v1);

    d1.min();  // min function for double : **compilation error** 

    std::complex<double> v2[2] = { { 1, 2 },{ 3, 4 } };
    DataArray<std::complex<double>> d2(v2);

    d2.min();  // min function for complex<double> : compilation error 
}

person lazug    schedule 26.11.2018    source источник
comment
Просто любопытно, как вы реализуете min для комплекса?   -  person Bob__    schedule 26.11.2018
comment
Как это сделал Матлаб. Функция min сложного вектора возвращает элемент с наименьшей величиной, которую вы можете вычислить с помощью этого кода: std::cout ‹‹ Мин. для комплекса ‹‹ std::endl; auto min_ = std::abs(*m_data); std::for_each(m_data + 1, m_data + m_numel, [&](auto v) mutable { auto modulus = std::abs(v); if (modulus ‹ min_) min_ = модуль; }); //возврат мин_; }   -  person lazug    schedule 27.11.2018


Ответы (1)


Параметр шаблона T шаблонов элементов дублирует параметр шаблона T шаблона класса. Дайте им другое имя; и укажите значение по умолчанию для параметра шаблона min(), иначе они не могут быть выведены. например

template<typename X>
using isComplex = std::is_same<X, std::complex<typename X::value_type>>;

template <typename X = T>
typename std::enable_if<isComplex<X>::value>::type min() {
    std::cout << "Min for complex" << std::endl;
}

template <typename X = T>
typename std::enable_if<std::is_arithmetic<X>::value>::type min() {
    std::cout << "Min for arithmetic values." << std::endl;
}

ПРЯМОЙ ЭФИР

person songyuanyao    schedule 26.11.2018
comment
О да я тупой. Большое спасибо songyuanyao за вашу помощь. - person lazug; 27.11.2018