2016-09-09 3 views
0

В связи с тем, что я работаю в проекте с библиотекой, которая использует 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.

+0

какой-либо причине вы не можете использовать 'строку :: c_str'? или использовать 'vector ' для вашего массива? –

+0

Возможно, вы ищете 'template void copyWithBoundaryCheck (char (& destination) [N], ...);' Я не совсем понимаю цели ваших игр с перегрузкой. Во-первых, первая перегрузка 'copyWithBoundaryCheck' никогда не будет жизнеспособной в разрешении перегрузки, поскольку' T' не может быть выведено. –

+0

Это очень похоже на догадки, которые, как это часто бывает на C++, не доходят до вас. Вам нужно просмотреть, как массивы работают на C++. –

ответ

4

Вы, вероятно, ищете что-то вроде этого:

template <size_t N> 
void copyWithBoundaryCheck(char (&destination)[N]) 
{ 
    printf("Correct parameter of size %zu\n", N); 
}; 

Demo

+0

Да, сэр! Отличный ответ! Я мог бы протестировать его тем временем с несколькими типами, и это именно то, что я искал! Приобретен и принят! Большое спасибо! Сейчас он даже очень изящный, потому что я ** НЕ ** должен указать размер поля * destination *. Это разрешено компилятором. Мне нравится этот ответ! –

Смежные вопросы