Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Шаблонная функция, считающая количество элементов массива

#cpp #шаблоны_с++


Функция foo() считает кол-во элементов массива. В случае с типом "char" все работает
правильно,а "int" - нет.
Код:

#include "pch.h"
#include 
using namespace std;

template

int foo(T *a)
{
    int i = 0;
    while (*a++)
    {
        i++;
    } return i + 1;
}

int main()
{
    char ch[] = "hellohowareu";
    int ii[] = { 1,2,3,4,5 };
    cout << foo(ch) << endl;
    cout << foo(ii) << endl;
    return 0;
}


з.ы. Функция списана из книжки Страуструпа,только "модернизировал" и добавил шаблон.
    


Ответы

Ответ 1



Смотрите: она считает while (*a++) количество элементов массива до первого нулевого. При инициализации массива символов строковым литералом в массив добавляется завершающий нулевой символ. В массиве int этого не делается, так что ваша функция выходит за пределы массива и идет дальше, пока не найдет ноль. Или пока не произойдет что-то неприятное :) - выход за границы массива - это UB, так что произойти может что угодно... Если очень хочется именно через свой шаблон - то вот вариант: template size_t foo(const T(&)[N]) { return N; } Но в C++17 такой шаблон уже есть, называется size.

Ответ 2



cout << std::distance(std::begin(ii), std::end(ii));

Комментариев нет:

Отправить комментарий