В стандартной библиотеке C++ есть куча функций вида:
void do(const char *text);
void do(const std::string &text);
Да, вроде здорово: можно передать и «сырую» строку и объект. А вот как быть, если строковых параметров два:
void set(const char *key, const char *val);
inline void set(const std::string &key, const char *val) {
set(key.c_str(), val);
}
inline void set(const char *key, const std::string &val) {
set(key, val.c_str());
}
inline void set(const std::string &key, const std::string &val) {
set(key.c_str(), val.c_str());
}
Уже многовато перегрузок как-то. Пока что вообще не пишу перегрузок, принимающих std::string, но приписывать постоянно .c_str() некрасиво.
А можно написать так:
void set(std::string key, std::string val);
С точки зрения использования сплошная красота: принимаются оба типа строк, всего одна функция. Но если передать такой функции «сырую» строку, то она будет лишний раз скопирована в объект (поскольку от COW-реализации строк в C++ отказались), что нехорошо.
Дискасс, как можно выкрутиться, чтобы и копировать поменьше и перегрузок не плодить.
И ещё вопрос по оптимизациям в компиляторе. Вот такой код:
inline void set(std::string key, std::string val) {
set_cargs(key.c_str(), val.c_str());
}
Может быть соптимизирован компилятором так, что создание промежуточного string не будет производиться, если оба параметра — const char *? Насколько я понимаю, так не получится, но может всё же кто-то сталкивался?