Шаблоны сумасшедшие ... Нужна помощь (кроме метадона) - PullRequest
0 голосов
/ 08 июня 2018

Возникла проблема (да, хорошо, у меня есть проблемы) ... с шаблонными методами.В приведенном ниже примере у меня есть шаблонный метод DoIt, фактический кусок кода работает нормально.Метод шаблона знает фактический размер передаваемого буфера (N).Но я также хочу иметь возможность вызова DoIt, передавая только адрес буфера и длину).Это мой метод DoItThisWay.

Как мне сделать, чтобы DoItThisWay вызывал DoIt таким образом, чтобы ограничить размер буфера, распознаваемого DoIt как имеющего только длину siz, передаваемую в DoItThisWay?

template<typename T, size_t N> size_t DoIt(T(&buf)[N], size_t siz) 
{
    // Work done here...
    return 0;
}

size_t DoItThisWay(uint8_t buf[], size_t siz)
{
    return DoIt.........
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

В аргументе функции uint8_t buf[] является просто синтаксическим сахаром для uint8_t *buf.

Вы не можете передать необработанный указатель, где ожидается ссылка на фиксированный массив.Даже если бы вы могли, вы не можете передать значение времени выполнения, например siz, в параметр шаблона, только константы, которые известны во время компиляции.Таким образом, DoItThisWay просто не может вызвать DoIt.

. Однако фиксированный массив превращается в указатель на свой первый элемент, поэтому DoIt может вызывать DoItThisWay, но только когда T равен uint8_t, что делает T избыточным (если у вас нет нескольких перегрузок DoItThisWay для разных типов данных или если DoItThisWay это свой собственный T параметр шаблона).

В любом случае, siz аргумент DoIt является избыточным и должен быть удален, так как DoIt может использовать вместо него N.

Попробуйте:

size_t DoItThisWay(uint8_t *buf, size_t siz)
{
    // Work done here...
    return 0;
}

template<size_t N>
size_t DoIt(uint8_t(&buf)[N])
{
    return DoItThisWay(buf, N);
}

Или

size_t DoItThisWay(uint8_t *buf, size_t siz)
{
    // Work done here...
    return 0;
}

// other overloads of DoItThisWay...

template<typename T, size_t N>
size_t DoIt(T(&buf)[N])
{
    return DoItThisWay(buf, N);
}

Или

template<typename T>
size_t DoItThisWay(T *buf, size_t siz)
{
    // Work done here...
    return 0;
}

template<typename T, size_t N>
size_t DoIt(T(&buf)[N])
{
    return DoItThisWay(buf, N);
}
0 голосов
/ 08 июня 2018

Нет хорошего способа вызвать DoIt из DoItThisWay, так как он знает только тип, но не размер во время компиляции.Вам нужно оба, чтобы позвонить DoIt.

size_t DoItThisWay(uint8_t buf[], size_t siz)
{
    // What value of N can you use here?
    return DoIt.........
}

Кстати, передача от siz до DoIt является излишней.Вы уже знаете размер.Это N.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...