Чем отличаются следующие шаблонные функции, использующие параметры / аргументы шаблона по умолчанию - PullRequest
1 голос
/ 06 февраля 2020

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

Первые 2 не имеют параметров шаблона по умолчанию, а последние 2 - нет. Первый и третий устанавливают аргумент по умолчанию для comp равным default_comparer<data_t>(), а второй и четыре - нет. Последний кажется бесполезным в том, что по умолчанию никогда не используется.

template<typename data_t>
struct default_comparer {
  bool operator()(const data_t& d1, const data_t& d2) const 
  {
    return d1 < d2;
  }
};

ПЕРВЫЙ

template<typename data_t, typename comparer_t>
pair partition(std::vector<data_t>& list, size_t pivot_idx, size_t start, size_t end, 
    const comparer_t& comp = default_comparer<data_t>()) 
{
  //do stuff
}

ВТОРОЙ ОДИН

template<typename data_t, typename comparer_t>
pair partition(std::vector<data_t>& list, size_t pivot_idx, size_t start, size_t end, 
    const comparer_t& comp = comparer_t()) 
{
  //do stuff
}

ТРЕТИЙ ОДИН

template<typename data_t, typename comparer_t = default_comparer<data_t>>
pair partition(std::vector<data_t>& list, size_t pivot_idx, size_t start, size_t end, 
    const comparer_t& comp = default_comparer<data_t>()) 
{
  //do stuff
}

ЧЕТВЕРТЫЙ

template<typename data_t, typename comparer_t = default_comparer<data_t>>
pair partition(std::vector<data_t>& list, size_t pivot_idx, size_t start, size_t end, 
    const comparer_t& comp = comparer_t()) 
{
  //do stuff
}

ПЯТЫЙ

template<typename data_t, typename comparer_t = default_comparer<data_t>>
pair partition(std::vector<data_t>& list, size_t pivot_idx, size_t start, size_t end, 
    const comparer_t& comp) 
{
  //do stuff
}

1 Ответ

2 голосов
/ 06 февраля 2020

В большинстве случаев четвертая версия является разумной версией.

Для первых двух версий аргумент по умолчанию не будет использоваться, если пользователь явно не предоставит аргумент шаблона для comparer_t, поскольку аргумент шаблона вычет происходит до того, как подключены аргументы по умолчанию; другими словами, аргументы по умолчанию не рассматриваются для целей вывода аргументов шаблона.

Разница между третьей и четвертой версиями становится очевидной, когда пользователь явно предоставляет аргумент шаблона comparer_t. В этом случае параметры по умолчанию этих версий различаются - третья версия требует преобразования из default_comparer<data_t>, что может привести к ошибке.

Разница между пятой версией и гипотетической версией, в которой ни одна из них по умолчанию не установлена аргументы шаблона или аргументы по умолчанию не приводятся в том, что первый допускает использование предоставленного аргумента шаблона по умолчанию в качестве запасного варианта в случае, если для него не удается выполнить дедукцию (например, когда пользователь предоставляет {} в качестве аргумента comp и не укажите аргумент шаблона для comparer_t).

Кстати, обратите внимание, что термин компаратор используется чаще, чем компаратор .

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