nut*_*100 1 c++ templates visual-c++ default-arguments
我有一个函数,如果 value_one 大于或小于 value_two,它会根据传递的比较结果打印出来。
template<typename T, typename cmp = less<T> >
void function(T value_one, T value_two, cmp) {
cmp comparator;
if (comparator(value_one, value_two)) {
std::cout << value_one;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这个函数默认使用less函数对象来决定是否打印value_one,但也可以使用more函数对象。
template<typename T>
class more {
public:
bool operator()(const T& value_one, const T& value_two) {
return value_one > value_two;
}
};
template<typename T>
class less{
public:
bool operator()(const T& value_one, const T& value_two) {
return value_one < value_two;
}
};
Run Code Online (Sandbox Code Playgroud)
当我在 main 中调用以下代码时
more<int> a;
function(7,5,a);
Run Code Online (Sandbox Code Playgroud)
7 按预期打印出来,但下一个代码被认为是非法的,VS 告诉我找不到匹配的重载函数。
function(5,7);
Run Code Online (Sandbox Code Playgroud)
我认为 cmp 函数对象在未明确提供时默认为 less,因此仍然可以工作。为什么这不起作用?有没有办法让这段代码工作而不重载它只有两个参数?
您已经默认了type cmp,但没有默认函数的参数。事实上,你没有给它任何名字。
您还需要为参数提供默认值:
template<typename T, typename cmp = less<T> >
void function(T value_one, T value_two, cmp = {}) {
// ...
}
Run Code Online (Sandbox Code Playgroud)