C++ - 当 std::less 是参数之一时,为模板函数的显式实例化提供什么类型?

met*_*sis 2 c++ templates

例如。函数头是:

template <class comparison_function, class iterator_type, class size_type>
bool F(comparison_function compare, iterator_type it)
Run Code Online (Sandbox Code Playgroud)

调用采用iterator_typecomparison_function参数,但不采用 size_type。因此,函数调用必须是显式的,例如:

F<?, std::vector<int>::iterator, long int>(std::less<int>(), it);
Run Code Online (Sandbox Code Playgroud)

会是什么?

use*_*570 5

什么会 ?是?

它应该是第一个传递的参数的类型,即std::less<int>

//vvvvvvvvvvvvvv----------------------------------------vvvvvvvvvvvvvv
F<std::less<int>, std::vector<int>::iterator, long int>(std::less<int>(), it);
Run Code Online (Sandbox Code Playgroud)

请注意,括号()表示std::less<int>()您正在传递类型为 的默认构造对象std::less<int>


边注

您可以通过使用模板参数推导来避免显传递两个模板参数。这可以通过将 设为第一个模板参数来完成size_type,以便可以从传递的参数中推导出其余两个模板参数,如下所示:

//--------vvvvvvvvvvvvvvv--------------------------->now size_type is the first template parameter
template <class size_type, class comparison_function, class iterator_type>
void F(comparison_function compare, iterator_type it);

int main()
{
//----------vvvvvvvvvvvvvvvvvvvv---->this uses template argument deduction for the remaining two parameters 
    F<long>(std::less<int>(), it);
}
Run Code Online (Sandbox Code Playgroud)