可调用对象作为默认模板参数
Callable object as default template argument
我在书上看了一些关于默认模板参数的东西,这段代码让我很困惑
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()
的意思,如果我把自己的比较函数传给模板,就可以了,怎么推导F
来自函数?
I don't understand the meaning of F f=F()
[...]
这就是您在 C++ 中向函数参数提供 default argument 的方式。就像我们一样,任何正常功能;比方说
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
可以不用第三个参数调用like
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
我在书上看了一些关于默认模板参数的东西,这段代码让我很困惑
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()
的意思,如果我把自己的比较函数传给模板,就可以了,怎么推导F
来自函数?
I don't understand the meaning of
F f=F()
[...]
这就是您在 C++ 中向函数参数提供 default argument 的方式。就像我们一样,任何正常功能;比方说
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
可以不用第三个参数调用like
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