Вызываемый объект в качестве аргумента шаблона по умолчанию - PullRequest
1 голос
/ 18 октября 2019

Я читал что-то о аргументе шаблона по умолчанию в книге, и этот фрагмент кода привел меня в замешательство

template<typename T, typename F = less<T>>
bool compare(const T& v1, const T& v2, F f = F())
{
    return f(v1, v2);
}

В книге сказано, что F представляет тип вызываемогообъект и привязать f к нему. Но как F может быть такого типа?

Я не понимаю значения F f=F(), и если я передам свой собственный шаблон function для сравнения, он сработает, как он может вывести F из функции?

1 Ответ

1 голос
/ 18 октября 2019

Я не понимаю значения F f=F() [...]

Таким образом, вы предоставляете аргумент по умолчанию для параметра функции в C ++. Так же, как мы делаем, любые нормальные функции;скажем

void func1(int i = 2)     {/*do something with i*/}
//         ^^^^^^^^^
void func2(int i = int()) {/*do something with i*/}
//         ^^^^^^^^^^^^^
void func3(int i = {})    {/*do something with i*/}
//         ^^^^^^^^^^

, который позволяет вызывать вышеуказанные функции с аргументом

func1(1); //---> i will be initialized to 1
func1(2); //---> i will be initialized to 2
func1(3); //---> i will be initialized to 3

или без предоставленного аргумента.

func1(); //---> i will be initialized to 2
func2(); //---> i will be initializedto 0
func3(); //---> i will be initialized to 0

Аналогичным образом compare можно вызывать без третьего параметра, например

compare(arg1, arg2) // ---> f will be `std::less<T>` here, which is the default argument

или с третьим параметром

compare(arg1, arg2, [](const auto& lhs, const auto& rhs){ return /*comparison*/;});
//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ some comparison function here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...