Перегрузка шаблона или функции для общего аргумента - PullRequest
1 голос
/ 09 марта 2012

У меня есть функция, которая принимает три аргумента

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*) ;

Но реализация функции требует, чтобы она была строкой, поэтому, если ей дан путь, ее необходимо преобразовать в строку внутрифункция, которую я не уверен, как это сделать, или если это даже хорошо делать.

Чтобы еще больше усложнить ситуацию, в будущем я мог бы захотеть расширить функцию, чтобы она также могла принимать наборстроки или набор путей вместо одной строки / пути в качестве второго аргумента.

Как лучше всего справиться со всем этим?Нет ли лучшего способа, чем иметь более одной реализации одной и той же функции?

Ответы [ 2 ]

6 голосов
/ 09 марта 2012

Перегруженные функции - лучший подход для вашего случая использования.

Я обычно придерживаюсь следующих правил:

  • Если вы хотите выполнить одинаковые действия над различными типами данных , тогдапредпочитаю шаблоны.

  • Если вы хотите выполнить различные действия над различными типами данных , тогда предпочитайте перегрузку функций.

Ваш вариант использования относится ко второй категории.

1 голос
/ 09 марта 2012

Почему бы просто не сделать такую ​​функцию, как:

void replace(const string s, const path p, string* ss) {
    replace(s, convert_to_string(path), ss);
}

Пусть оптимизатор решит, как ему с этим справиться. Что в этом не элегантного? Ваш шаблонный метод будет делать то же самое, он будет более сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...