że mamy klasę, która może pisać rzeczy do wyjściaprojekt Interfejs: bezpieczeństwo funkcji przeciążonej biorąc ciąg i char tablicę
class Writer
{
public:
int write(const std::string& str);
int write(const char* str, int len);
//...
};
I było w porządku z tym, jej elastyczność i to wszystko, aż zdałem sobie sprawę
char* buf = new char[n]; //not terminated with '\0'
//load up buf
Writer w;
w.write(buf); //compiles!
To jest niepoprawny błąd naprawdę.
Możemy zmienić nieco z niektórych szablonów
class WriterV2
{
public:
int write(const std::string& str);
int write(const char* str, int len);
template<typename... Args>
int write(const char*, Args...)
{ static_assert(sizeof...(Args) < 0, "Incorrect arguments"); }
//...
};
Ale ta metoda ma swoje problemy
WriterV2 w;
w.write("The templating genius!"); //compile error
Co mam zrobić? Czym jest lepszy projekt?
I zanim ktokolwiek zapyta, przeciążenie dla const char (&)[N]
does not work. Może być możliwe utworzenie wrappera, aby to zrobić, ale wydaje się, że ... przesada?
EDYCJA Dodanie metody write(char*)
i wysłanie błędu nie jest idealne. Po przejściu buf
wokół funkcji i tak dalej, może to oznaczać const char*
.
Dlaczego po prostu nie zadeklarujesz metody obsługi tego przypadku, ale nie zastosuj go? int write (char * str); – ifma
Okay, ale dlaczego musi istnieć rozróżnienie między tymi dwoma typami? Ponadto, wywołanie 'w.write (buf);' spowoduje _wejście_ wywołanie 'int Writer :: write (const std :: string & str);' Jeśli chcesz, aby wywołało 'int Writer :: write (const char * str, int len) ; ', a następnie dodaj parametr długości do twojego połączenia – InternetAussie
Użyj std :: vector jako bufora –