Estou desenvolvendo uma classe utilitária de strings que fornece diversas funções de manipulação de strings. Quero que os usuários tenham duas opções ao usar essas funções:
Crie e retorne uma nova string com a manipulação aplicada
Atualizar a sequência de caracteres existente no local
Atualmente, implementei isso com sobrecarga de função:
struct String final {
static std::string toUpperCase(const std::string& str) {
std::string result = str;
std::transform(result.begin(), result.end(), result.begin(),
[](unsigned char c) { return std::toupper(c); });
return result;
}
static void toUpperCase(std::string& str) {
std::transform(str.begin(), str.end(), str.begin(),
[](unsigned char c) { return std::toupper(c); });
}
};
int main() {
std::string str {"helloworld"};
std::string test = String::toUpperCase(str);
String::toUpperCase(str);
}
Minha pergunta: É possível combinar essas duas funções em uma única função que pode:
-> Retorna uma nova string maiúscula quando necessário
-> Modifique uma string no local quando desejado
Qual seria a abordagem C++ mais elegante e idiomática para isso? Considerei modelos e parâmetros opcionais, mas não tenho certeza de qual abordagem forneceria a API mais limpa para os usuários.
Se não for possível combinar essas duas funções em uma única função, também estou interessado em saber como eliminar a std::transform...
duplicação de code( ) entre elas.
Observação: Estou ciente de que a implementação que mostrei não compilaria. Estou compartilhando-a especificamente para ilustrar a abordagem que eu estava considerando e os desafios que estou enfrentando com sobrecarga de funções e especialização de modelos.