У меня есть функция, которая принимает три аргумента
void replace(const string, const string, string*) ;
Моя проблема - второй аргумент, который я хотел бы переписать, чтобы он мог быть либо строкой, либо объектом Path (из библиотеки Boost Filesystem, но на самом деле любой объект, который можно рассматривать как строку, должен делать), поэтому мне не нужно конвертировать пути в строки повсюду.
Я знаю, что могу перегрузить функцию и сделать две реализации, вот что я делаю сейчас, поэтому у меня есть две реализации одной и той же функции:
void replace(const string, const string, string*) ;
void replace(const string, const path, string*) ;
Но это не выглядит очень элегантно, даже если второй просто преобразует путь в строку и вызывает первый (так что не так много дублирования кода).Вместо этого я попытался использовать шаблоны, например:
template <class T>
void replace(const string, const T, string*) ;
Но реализация функции требует, чтобы она была строкой, поэтому, если ей дан путь, ее необходимо преобразовать в строку внутрифункция, которую я не уверен, как это сделать, или если это даже хорошо делать.
Чтобы еще больше усложнить ситуацию, в будущем я мог бы захотеть расширить функцию, чтобы она также могла принимать наборстроки или набор путей вместо одной строки / пути в качестве второго аргумента.
Как лучше всего справиться со всем этим?Нет ли лучшего способа, чем иметь более одной реализации одной и той же функции?