В связи с тем, что я работаю в проекте с библиотекой, которая использует C API, я должен использовать частичный char []
[даже я бы хотел использовать только std::string
].Специализированный шаблон для безопасной копии char [] с граничной проверкой
Как всегда, для того, чтобы избежать проблем при копировании слишком долго char *
переменного в затруднительного размереchar []
я пытался поймать эту проблему с помощью шаблона.
Но, к сожалению, я придерживаюсь специализации. В проекте мы можно предположить, чтоназначения переменная всегда типа char [fixed-value]
И это не должно бытьchar *
. Поэтому это важно, потому что на самом деле нет надежного способа определить размер выделенного размера char *
.
Это то, что я попытался так далеко:
#include <stdio.h>
template <typename T>
void copyWithBoundaryCheck(char destination [], char * source, int maximalSize)
{
printf("Correct parameter\n");
};
template <typename T>
void copyWithBoundaryCheck(T, char * source, int maximalSize)
{
printf("Wrong parameter\n");
};
int main()
{
char * source = (char *) "Source";
char * wrongPtr = (char *) malloc(20);
char destination [20];
copyWithBoundaryCheck(wrongPtr, source, 10);
copyWithBoundaryCheck(destination, source, sizeof(destination));
}
Это выход:
Wrong parameter <-- output for copyWithBoundaryCheck(wrongPtr, source, 10);
Wrong parameter <-- output for copyWithBoundaryCheck(destination, source, sizeof(destination));
Для copyWithBoundaryCheck(destination, source, sizeof(destination));
я ожидал выход Correct parameter
, но я получаю всегда Wrong parameter
.
Мой вопрос:
Как будет осуществляться специализация функции шаблона copyWithBoundaryCheck
для пойматьchar [numeric-value]
? Согласно моему примеру, это означало бы, что copyWithBoundaryCheck(destination, source, sizeof(destination));
отобразит Correct parameter
.
какой-либо причине вы не можете использовать 'строку :: c_str'? или использовать 'vector' для вашего массива? –
Возможно, вы ищете 'template void copyWithBoundaryCheck (char (& destination) [N], ...);' Я не совсем понимаю цели ваших игр с перегрузкой. Во-первых, первая перегрузка 'copyWithBoundaryCheck' никогда не будет жизнеспособной в разрешении перегрузки, поскольку' T' не может быть выведено. –
Это очень похоже на догадки, которые, как это часто бывает на C++, не доходят до вас. Вам нужно просмотреть, как массивы работают на C++. –