Сумма шаблона элементов контейнера (возвращены проблемы с value_type) - PullRequest
0 голосов
/ 03 октября 2019

Это упражнение из предыдущего теста c ++, которое я взял:

Реализация шаблонной функции sum , которая принимает в качестве чисел контейнер и возвращает их сумму. (Совет: если C это тип контейнера, тип элементов возвращается, например, из C :: value_type ).

Во время тестаЯ совсем не был готов, но сейчас, на сумму универсального контейнера, я бы сказал:

template<typename Iter>
double sum(Iter b, Iter e)
{
    double ret=0;
    for(;b!=e;b++)
        ret+=*b;
    return ret;
}

или

template<typename C>
double sum(const C& cnt)
{
    double ret=0;
    for(auto it=cnt.begin();it!=cnt.end();it++)
        ret+=*it;
    return ret;
}

Мой вопрос здесь, как можноЯ заменил аргумент возврата функции фактическим типом элементов контейнера?

1 Ответ

2 голосов
/ 03 октября 2019

Использование typename C::value_type:

template<typename C>
typename C::value_type sum(const C& cnt)
{
    typename C::value_type ret{}; // default initialization
    for(auto it=cnt.begin();it!=cnt.end();it++)
        ret+=*it;
    return ret;
}

Начиная с C ++ 14, вы можете использовать auto в качестве типа возврата sum шаблона:

template<typename C>
auto sum2(const C& cnt) // before calling check if cnt is not empty
{
    auto it = cnt.begin();
    auto ret = *it;   // deduce type by dereferencing
    for(++it;it!=cnt.end();it++)
        ret+=*it;
    return ret;
}
...