вопросы по шаблонным признакам (связанные с числовыми вычислениями по двойному и комплексному числу)

0

То, что я хотел бы сделать, это просто вычислить ошибку между двумя векторами, но входные векторы могут содержать сложные или действительные числа. Пока у меня есть решение.

template<typename T1, typename T2>
T1 computeError(const std::vector<T1> & in1,
                           const std::vector<T2> & in2)
{
    int size = in1.size();
    T1 error = 0;
    for(int i = 0; i < size; i++) {
    error += std::abs(in1[i]- in2[i]);
    }
    return error;
};

template<typename T1, typename T2>
T1 computeError(const std::vector<complex<T1> > & in1,
                           const std::vector<complex<T2> > & in2)
{
    int size = in1.size();
    T1 error = 0;
    for(int i = 0; i < size; i++) {
    error += std::abs(in1[i] - in2[i]);
    }
    return error;
};

Поэтому в основном я реализовал две функции. Но они очень похожи друг на друга. Мне интересно, есть ли способ реализовать только одну функцию, охватывающую оба случая.

благодаря

  • 0
    Эти две функции дают разные результаты при применении к сложному случаю, так что вы действительно пытаетесь сделать это специализацией шаблона, поэтому я думаю, что единственный способ сделать это с одной функцией - это ужасный хак, намного хуже, чем у вас.
  • 1
    Брось вторую; первый работает для обоих случаев.
Теги:
templates
traits

1 ответ

0
Лучший ответ

Следующий код должен работать с С++ 11

template<typename T1, typename T2>
std::conditional<is_class<T1>, T1:value_type, T1> computeError(const std::vector<T1> & in1,
                           const std::vector<T2> & in2)
{
    int size = in1.size();
    typename std::conditional<is_class<T1>, T1:value_type, T1> error = 0;
    for(int i = 0; i < size; i++) {
    error += std::abs(in1[i]- in2[i]);
    }
    return error;
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню